1. 程式人生 > >【轉載】.NET Remoting學習筆記(三)信道

【轉載】.NET Remoting學習筆記(三)信道

star fig cati 服務端 pro net string spa 處理類型

目錄
  • .NET Remoting學習筆記(一)概念
  • .NET Remoting學習筆記(二)激活方式
  • .NET Remoting學習筆記(三)信道

參考:♂風車車.Net

.NET Framework 遠程處理基礎結構提供下列信道實現:
  • IpcChannel
  • TcpChannel
  • HttpChannel
IpcChannel

IPCChannel是.NET Framework 2.0 裏面新增的,它使用 Windows 進程間通信 (IPC) 系統在同一計算機上的應用程序域之間傳輸消息。在同一計算機上的應用程序域之間進行通信時,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本機應用之間通信。所以,在客戶端和服務端在同一臺機器時,我們可以通過註冊IPCChannel來提高Remoting的性能。但如果客戶端和服務端不在同一臺機器時,我們不能註冊IPCChannel。

IpcChannel 執行下列功能:

  • 使用命名管道在發送方和接收方之間通信。
  • 支持以二進制格式和行業標準 SOAP 序列化格式編碼負載。
  • 生成並使用對象引用的 ChannelDataStore。
  • 支持模擬和委托。
  • 支持在命名管道上利用訪問控制列表 (ACL) 來提供高級訪問控制。
TcpChannel

TcpChannel 類使用二進制格式化程序將所有消息序列化為二進制流,並使用 TCP 協議將該流傳輸至目標統一資源標識符 (URI)。

TcpChannel 執行下列功能:

  • 使用 TCP 套接字在發送方和接收方之間通信。
  • 支持以二進制格式和行業標準 SOAP 序列化格式編碼負載。
  • 生成並使用對象引用的 ChannelDataStore。
  • 支持模擬和委托。
  • 支持 SSPI 加密。
HttpChannel

HttpChannel 類使用 SOAP 協議在遠程對象之間傳輸消息。所有消息都通過 SoapFormatter 傳遞,此格式化程序會將消息轉換為 XML 並進行序列化,同時向數據流中添加所需的 SOAP 標頭。如果還指定了二進制格式化程序,則會創建二進制數據流。隨後,將使用 HTTP 協議將數據流傳輸至目標 URI。

HttpChannel 符合 SOAP 1.1 標準,它執行下列功能:

  • 通過將 HTTP 協議用作傳輸在發送方和接收方之間通信。
  • 支持以 SOAP(一種 XML 編碼標準)和二進制格式編碼負載。
  • 將接收方設置為通過 ASP.NET 和 TCP 套接字接收 HTTP 請求並發送 HTTP 響應。
  • 生成並使用對象引用的 ChannelDataStore。
  • 支持模擬和委托。
  • 支持 SSPI 加密。

下面貼代碼:

1.定義遠程對象

using System;
using System.Runtime.Remoting.Metadata;

namespace MessageMarshal
{
    /*創建發送消息委托*/
    public delegate void SendMessageHandler(string messge);

    [Serializable]
    public class TestMessageMarshal : MarshalByRefObject
    {
        private Guid ID { get; set; }

        /*新建對象實例時重新創建標識編號*/
        public TestMessageMarshal()
        {
            ID = Guid.NewGuid();
        }

        /*創建發送消息事件*/
        public static event SendMessageHandler SendMessageEvent;

        /*發送消息*/
        [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")]
        public void SendMessage(string messge)
        {
            if (SendMessageEvent != null)
                SendMessageEvent(ID.ToString() + "\t" + messge);
        }
    }
}

2.定義服務端

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

namespace TestRemotingServer
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("創建HTTP通道");

            /*創建HTTP通道*/
            TcpChannel channel = new TcpChannel(816);

            /*註冊通道服務端*/
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.ApplicationName = "test";

            /*服務端註冊,使用SingleCall激活*/
            RemotingConfiguration.RegisterActivatedServiceType(typeof(MessageMarshal.TestMessageMarshal));

            Console.WriteLine("started ..."); 

            /*接收客戶端事件*/
            MessageMarshal.TestMessageMarshal.SendMessageEvent += new MessageMarshal.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.Tcp;
using System.Threading;

namespace TestRemotingClient
{
    class Program
    {
        static void Main(string[] args)
        {
            /*創建通道*/
            TcpChannel channel = new TcpChannel();

            /*註冊通道*/
            ChannelServices.RegisterChannel(channel, false);

            /*註冊通道 的 遠程處理類型*/
            RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "tcp://localhost:816/test");

            /*創建消息實體*/
            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 咱只寫三篇 應該能給大家帶來些了解,應對面試

作者:釋迦苦僧 出處:http://www.cnblogs.com/woxpp/p/3997984.html

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

【轉載】.NET Remoting學習筆記(三)信道