.NET Remoting 學(xué)習(xí)

1月8日 周二 陰云密布

聽說明天是暴雪欣舵,這真是個(gè)不幸的消息擎鸠。
算了,該來的總得來缘圈。不如老老實(shí)實(shí)的工作劣光,應(yīng)該說是踏踏實(shí)實(shí)的學(xué)習(xí),哈哈糟把【钗校總覺得這樣的環(huán)境有些安逸,讓人提不起來斗志遣疯。但是工作的時(shí)間總該是專心致志的雄可,這點(diǎn)倒還是不賴〔可是下班后的時(shí)間数苫,總是覺得頹廢。心里一直有股熱流辨液,呼之欲出虐急。可能會(huì)是下個(gè)轉(zhuǎn)折點(diǎn)吧滔迈,莫名期待止吁。
這日記寫著寫著會(huì)不會(huì)讓人越發(fā)感性,細(xì)思恐極燎悍!我還是記錄點(diǎn)學(xué)習(xí)進(jìn)度吧~~

.NET Remoting

什么是 Remoting敬惦,簡(jiǎn)而言之,我們可以將其看作是一種分布式處理方式谈山。 .NET Remoting 提供了一種允許對(duì)象通過應(yīng)用程序域與另一對(duì)象進(jìn)行交互的框架俄删。在 Remoting 中是通過通道(channel)來實(shí)現(xiàn)兩個(gè)應(yīng)用程序域之間對(duì)象的通信的。

實(shí)現(xiàn)步驟

[服務(wù)端]

1. 注冊(cè)通道

要跨越應(yīng)用程序域進(jìn)行通信奏路,必須實(shí)現(xiàn)通道抗蠢。如前所述,Remoting 提供了 IChannel 接
口思劳,分別包含 TcpChannel 和 HttpChannel 兩種類型的通道迅矛。這兩種類型除了性能和序列化數(shù)
據(jù)的格式不同外,實(shí)現(xiàn)的方式完全一致潜叛,因此下面我們就以 TcpChannel 為例秽褒。

注冊(cè) TcpChannel壶硅,首先要在項(xiàng)目中添加引用“System.Runtime.Remoting”,然后 using
名字空間:System.Runtime.Remoting.Channel.Tcp销斟。代碼如下:

TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel); 

在實(shí)例化通道對(duì)象時(shí)庐椒,將端口號(hào)作為參數(shù)傳遞。然后再調(diào)用靜態(tài)方法 RegisterChannel()來注
冊(cè)該通道對(duì)象即可蚂踊。

2.注冊(cè)遠(yuǎn)程對(duì)象

注冊(cè)了通道后约谈,要能激活遠(yuǎn)程對(duì)象,必須在通道中注冊(cè)該對(duì)象犁钟。根據(jù)激活模式的不同棱诱,
注冊(cè)對(duì)象的方法也不同。
1) SingleTon 模式
對(duì)于 WellKnown 對(duì)象涝动,可以通過靜態(tài)方法
RemotingConfiguration.RegisterWellKnownServiceType()來實(shí)現(xiàn):

RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ServerRemoteObject.ServerObject),
"ServiceMessage",WellKnownObjectMode.SingleTon); 

2)SingleCall 模式
注冊(cè)對(duì)象的方法基本上和 SingleTon 模式相同迈勋,只需要將枚舉參數(shù)
WellKnownObjectMode 改為 SingleCall 就可以了。

RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(ServerRemoteObject.ServerObject),
 "ServiceMessage",WellKnownObjectMode.SingleCall); 

3)客戶端激活模式
對(duì)于客戶端激活模式醋粟,使用的方法又有不同靡菇,但區(qū)別不大,看了代碼就一目了然米愿。

RemotingConfiguration.ApplicationName = "ServiceMessage";
RemotingConfiguration.RegisterActivatedServiceType(
 typeof(ServerRemoteObject.ServerObject)); 
3.注銷通道

如果要關(guān)閉 Remoting 的服務(wù)厦凤,則需要注銷通道,也可以關(guān)閉對(duì)通道的監(jiān)聽育苟。在 Remoting
中當(dāng)我們注冊(cè)通道的時(shí)候较鼓,就自動(dòng)開啟了通道的監(jiān)聽。而如果關(guān)閉了對(duì)通道的監(jiān)聽宙搬,則該通
道就無法接受客戶端的請(qǐng)求笨腥,但通道仍然存在拓哺,如果你想再一次注冊(cè)該通道勇垛,會(huì)拋出異常。

//獲得當(dāng)前已注冊(cè)的通道士鸥;
IChannel[] channels = ChannelServices.RegisteredChannels;
//關(guān)閉指定名為 MyTcp 的通道闲孤;
foreach (IChannel eachChannel in channels)
{
 if (eachChannel.ChannelName == "MyTcp")
 {
 TcpChannel tcpChannel = (TcpChannel)eachChannel;
 //關(guān)閉監(jiān)聽;
 tcpChannel.StopListening(null);
 //注銷通道烤礁;
 ChannelServices.UnregisterChannel(tcpChannel);
 }
}

[客戶端]

客戶端主要做兩件事讼积,一是注冊(cè)通道。這一點(diǎn)從圖一就可以看出脚仔,Remoting 中服務(wù)器
端和客戶端都必須通過通道來傳遞消息勤众,以獲得遠(yuǎn)程對(duì)象。第二步則是獲得該遠(yuǎn)程對(duì)象鲤脏。

1.注冊(cè)通道
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel); 

注意在客戶端實(shí)例化通道時(shí)们颜,是調(diào)用的默認(rèn)構(gòu)造函數(shù)吕朵,即沒有傳遞端口號(hào)。事實(shí)上窥突,這個(gè)端
口號(hào)是缺一不可的努溃,只不過它的指定被放在后面作為了 Uri 的一部分。

2. 獲取遠(yuǎn)程對(duì)象

(1)WellKnown 激活模式

ServerRemoteObject.ServerObject serverObj =
(ServerRemoteObject.ServerObject)Activator.GetObject(
 typeof(ServerRemoteObject.ServerObject),"tcp://localhost:8080/ServiceMessage"); 

首先以 WellKnown 模式激活阻问,客戶端獲得對(duì)象的方法是使用 GetObject()梧税。其中參數(shù)
第一個(gè)是遠(yuǎn)程對(duì)象的類型。第二個(gè)參數(shù)就是服務(wù)器端的 uri称近。如果是 http 通道第队,自然是用
http://localhost:8080/ServiceMessage 了。因?yàn)槲沂怯帽镜貦C(jī)煌茬,所以這里是 localhost斥铺,你可以
用具體的服務(wù)器 IP 地址來代替它。端口必須和服務(wù)器端的端口一致坛善。后面則是服務(wù)器定義
的遠(yuǎn)程對(duì)象服務(wù)名晾蜘,即 ApplicationName 屬性的內(nèi)容。

(2)客戶端激活模式
如前所述眠屎,WellKnown 模式在客戶端創(chuàng)建對(duì)象時(shí)剔交,只能調(diào)用默認(rèn)的構(gòu)造函數(shù),上面的代
碼就說明了這一點(diǎn)改衩,因?yàn)?GetObject()方法不能傳遞構(gòu)造函數(shù)的參數(shù)岖常。而客戶端激活模式則可
以通過自定義的構(gòu)造函數(shù)來創(chuàng)建遠(yuǎn)程對(duì)象。

客戶端激活模式有兩種方法:
1) 調(diào)用 RemotingConfiguration 的靜態(tài)方法 RegisterActivatedClientType()葫督。這個(gè)方法返回值為Void竭鞍,它只是將遠(yuǎn)程對(duì)象注冊(cè)在客戶端而已。具體的實(shí)例化還需要調(diào)用對(duì)象類的構(gòu)造函數(shù)橄镜。

 RemotingConfiguration.RegisterActivatedClientType(
 typeof(ServerRemoteObject.ServerObject), "tcp://localhost:8080/ServiceMessage");
 ServerRemoteObject.ServerObject serverObj = new ServerRemoteObject.ServerObject(); 

2) 調(diào)用進(jìn)程 Activator 的 CreateInstance()方法偎快。這個(gè)方法將創(chuàng)建方法參數(shù)指定類型的類對(duì)象。它與前面的 GetObject()不同的是洽胶,它要在客戶端調(diào)用構(gòu)造函數(shù)晒夹,而 GetObject()只是獲得對(duì)象,而創(chuàng)建實(shí)例是在服務(wù)器端完成的姊氓。CreateInstance()方法有很多個(gè)重載丐怯,我著重說一下其中常用的兩個(gè)。

a翔横、public static object CreateInstance(Type type, object[] args, 
object[] activationAttributes);
b读跷、public static ObjectHandle CreateInstance(string assemblyName, string typeName,
object[] activationAttribute); 

補(bǔ)充

通過上面的描述,基本上已經(jīng)完成了一個(gè)最簡(jiǎn)單的 Remoting 程序禾唁。這是一個(gè)標(biāo)準(zhǔn)的創(chuàng)建 Remoting 程序的方法效览,但在實(shí)際開發(fā)過程中些膨,我們遇到的情況也許千奇百怪,如果只掌握一種所謂的“標(biāo)準(zhǔn)”钦铺,就妄想可以“一招鮮订雾、吃遍天”,是不可能的矛洞。

注:本文參考:http://www.cnblogs.com/xia520pi/ 蝦皮工作室洼哎,僅供學(xué)習(xí),請(qǐng)勿轉(zhuǎn)載沼本!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末噩峦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抽兆,更是在濱河造成了極大的恐慌识补,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辫红,死亡現(xiàn)場(chǎng)離奇詭異凭涂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贴妻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門切油,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人名惩,你說我怎么就攤上這事澎胡。” “怎么了娩鹉?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵攻谁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我弯予,道長(zhǎng)戚宦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任熙涤,我火速辦了婚禮阁苞,結(jié)果婚禮上困檩,老公的妹妹穿的比我還像新娘祠挫。我一直安慰自己,他們只是感情好悼沿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布等舔。 她就那樣靜靜地躺著,像睡著了一般糟趾。 火紅的嫁衣襯著肌膚如雪慌植。 梳的紋絲不亂的頭發(fā)上甚牲,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音蝶柿,去河邊找鬼丈钙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛交汤,可吹牛的內(nèi)容都是我干的雏赦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芙扎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼星岗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戒洼,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤俏橘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后圈浇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥掐,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年磷蜀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曹仗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蠕搜,死狀恐怖怎茫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妓灌,我是刑警寧澤轨蛤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站虫埂,受9級(jí)特大地震影響祥山,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掉伏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一缝呕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斧散,春花似錦供常、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箍镜,卻和暖如春源祈,著一層夾襖步出監(jiān)牢的瞬間煎源,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工香缺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留手销,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓图张,卻偏偏與公主長(zhǎng)得像原献,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埂淮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Welcome to React! React是什么姑隅?為什么要使用它? React是Facebook內(nèi)部的一個(gè)Ja...
    泡泡糖_966c閱讀 246評(píng)論 0 0
  • 人生就像是一場(chǎng)螺旋式的游戲,是螺旋上升痪蝇,因?yàn)槟阋砷L(zhǎng)鄙陡;有些相同的道理會(huì)蘊(yùn)藏在人生的不同階段,像攀爬一座螺旋上升的樓...
    Born_to_try閱讀 187評(píng)論 1 0
  • 偶然發(fā)現(xiàn)同事小哥是曾經(jīng)的校友躏啰,他迫不及待地跟我核對(duì)著當(dāng)初學(xué)校的種種趁矾,看著他各種激動(dòng)欣喜,我佯裝著同樣的感情给僵。 其實(shí)...
    Rachel曹閱讀 241評(píng)論 0 3
  • 今年毫捣,已經(jīng)不惑之年了,按老話早就是不學(xué)藝的年紀(jì)了帝际。 可是蔓同,發(fā)現(xiàn)世界越來越精彩,變化越來越大蹲诀,超出自己的理解能力斑粱,很...
    健的XUYU閱讀 353評(píng)論 0 0
  • 一支球隊(duì)可以整出這么多十年一遇的事情,說到NBA可以追溯到——西科比東艾弗森南麥蒂北卡特的年代脯爪,最早的時(shí)候高中则北,我...
    小小僵尸姑娘閱讀 277評(píng)論 2 0