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)載沼本!