zoukankan      html  css  js  c++  java
  • .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;
    
    /*code 释迦苦僧*/
    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() + "	" + messge);
            }
        }
    }

    2.定义服务端

    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);
    
                /*注册通道服务端*/
                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");
                /*创建消息实体*/
                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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

     

  • 相关阅读:
    HDU 4772 Zhuge Liang's Password (矩阵旋转)
    POJ 1141 Brackets Sequence(区间DP)
    POJ 2531 Network Saboteur (DFS)
    HDU 2680 Choose the best route (最短路)
    HDU 1285 确定比赛名次 (预处理+拓扑排序)
    HDU 4540 威威猫系列故事——打地鼠 (DP)
    HDU 2899 Strange fuction (二分)
    HDU 3485 Count 101(DP)
    codeforces 510c (拓扑排序)
    codeforces 510B Fox And Two Dots(dfs)
  • 原文地址:https://www.cnblogs.com/woxpp/p/3997984.html
Copyright © 2011-2022 走看看