參考:♂風(fēng)車車.Net
IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 進程間通信 (IPC) 系統(tǒng)在同一計算機上的應(yīng)用程序域之間傳輸消息。在同一計算機上的應(yīng)用程序域之間進行通信時,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本機應(yīng)用之間通信。所以,在客戶端和服務(wù)端在同一臺機器時,我們可以通過注冊IPCChannel來提高Remoting的性能。但如果客戶端和服務(wù)端不在同一臺機器時,我們不能注冊IPCChannel。
IpcChannel 執(zhí)行下列功能:
TcpChannel 類使用二進制格式化程序?qū)⑺邢⑿蛄谢癁槎M制流,并使用 TCP 協(xié)議將該流傳輸至目標統(tǒng)一資源標識符 (URI)。
TcpChannel 執(zhí)行下列功能:
HttpChannel 類使用 SOAP 協(xié)議在遠程對象之間傳輸消息。所有消息都通過 SoapFormatter 傳遞,此格式化程序會將消息轉(zhuǎn)換為 xml 并進行序列化,同時向數(shù)據(jù)流中添加所需的 SOAP 標頭。如果還指定了二進制格式化程序,則會創(chuàng)建二進制數(shù)據(jù)流。隨后,將使用 HTTP 協(xié)議將數(shù)據(jù)流傳輸至目標 URI。
HttpChannel 符合 SOAP 1.1 標準,它執(zhí)行下列功能:
下面貼代碼:
1.定義遠程對象
using System;using System.Runtime.Remoting.Metadata;/*code 釋迦苦僧*/namespace MessageMarshal{ /*創(chuàng)建發(fā)送消息委托*/ public delegate void SendMessageHandler(string messge); [Serializable] public class TestMessageMarshal : MarshalByRefObject { PRivate Guid ID { get; set; } /*新建對象實例時重新創(chuàng)建標識編號*/ public TestMessageMarshal() { ID = Guid.NewGuid(); } /*創(chuàng)建發(fā)送消息事件*/ public static event SendMessageHandler SendMessageEvent; /*發(fā)送消息*/ [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")] public void SendMessage(string messge) { if (SendMessageEvent != null) SendMessageEvent(ID.ToString() + "/t" + messge); } }}2.定義服務(wù)端
using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Http;using System.Runtime.Remoting.Channels.Ipc;using System.Runtime.Remoting.Channels.Tcp;using MessageMarshal;namespace TestRemotingServer{ /*code:釋迦苦僧*/ class Program { static void Main(string[] args) { //IpcChannel channel_ipc = new IpcChannel("localhost:8226"); //HttpChannel channel_http = new HttpChannel(8226); TcpChannel channel_tcp = new TcpChannel(8226); /*注冊通道服務(wù)端*/ ChannelServices.RegisterChannel(channel_tcp, false); RemotingConfiguration.applicationName = "test"; RemotingConfiguration.RegisterActivatedServiceType(typeof(TestMessageMarshal)); Console.WriteLine("started ..."); /*接收客戶端事件*/ TestMessageMarshal.SendMessageEvent+=new SendMessageHandler(TestMessageMarshal_SendMessageEvent); Console.Read(); } static void TestMessageMarshal_SendMessageEvent(string messge) { Console.WriteLine(messge); } }}3.定義客戶端:
using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Http;using System.Runtime.Remoting.Channels.Ipc;using System.Runtime.Remoting.Channels.Tcp;using System.Threading;/*code 釋迦苦僧*/namespace TestRemotingClient{ class Program { static void Main(string[] args) { //IpcChannel channel = new IpcChannel(); //HttpChannel channel_http = new HttpChannel(); TcpChannel channel_tcp = new TcpChannel(); ChannelServices.RegisterChannel(channel_tcp, false); /*注冊通道 的 遠程處理類型*/ //RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "ipc://localhost:8226/test"); //RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:8226/test"); RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "tcp://localhost:8226/test"); /*創(chuàng)建消息實體*/ MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal(); while (true) { TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString()); Console.WriteLine("send message..."); Thread.Sleep(2000); } } }}4.測試
.NET Remoting 咱只寫三篇 應(yīng)該能給大家?guī)硇┝私猓瑧?yīng)對面試
作者:釋迦苦僧 出處:http://m.survivalescaperooms.com/woxpp/p/3997984.html 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
新聞熱點
疑難解答