【转载】.NET Remoting学习笔记(三)信道

【转载】.NET Remoting学习笔记(三)信道

目录
  • .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.测试
    <span>【转载】.NET Remoting学习笔记(三)信道</span>

     

    定义为TcpChannel 时

    定义服务端:

    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Ipc;
    
    namespace TestRemotingServer
    {
        public class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("创建ICP通道");
    
                /*创建HTTP通道*/
                IpcServerChannel channel = new IpcServerChannel("Server");
    
                /*注册通道服务端*/
                ChannelServices.RegisterChannel(channel, false);
                RemotingConfiguration.ApplicationName = "test";
    
                /*客户端激活*/
                RemotingConfiguration.RegisterActivatedServiceType(typeof(MessageMarshal.TestMessageMarshal));
    
                /*接收客户端事件*/
                MessageMarshal.TestMessageMarshal.SendMessageEvent += new MessageMarshal.SendMessageHandler(TestMessageMarshal_SendMessageEvent);
    
                Console.Read();
            }
    
            static void TestMessageMarshal_SendMessageEvent(string messge)
            {
                Console.WriteLine(messge);
            }
        }
    }

    定义客户端:

    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Ipc;
    using System.Threading;
    
    namespace TestRemotingClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                /*创建通道*/
                IpcClientChannel channel = new IpcClientChannel();
    
                /*注册通道*/
                ChannelServices.RegisterChannel(channel, false);
    
                /*注册通道 的 远程处理类型*/
                RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "ipc://Server/test");
    
                /*创建消息实体*/
                MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();
    
                while (true)
                {
                    TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                    Console.WriteLine("send message...");
                    Thread.Sleep(2000);
                }
            }
        }
    }

    运行结果

    image

    .NET Remoting 咱只写三篇 应该能给大家带来些了解,应对面试

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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

    发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119393.html原文链接:https://javaforall.net

    (0)
    全栈程序员-站长的头像全栈程序员-站长


    相关推荐

    • 数据库严格模式_mysql关系型数据库

      数据库严格模式_mysql关系型数据库设置严格模式为当前会话设置严格模式:执行SETsql_mode=’STRICT_TRANS_TABLES’或者SETsql_mode=’STRICT_ALL_TABLES’。全局设置严格模式:执行SETglobalsql_mode=’STRICT_TRANS_TABLES’或者SETglobalsql_mode=’STRICT_ALL_TABLES’。或者在MyS…

      2025年7月10日
      0
    • 一起学JAVA API Object String StringBuffer/StringBuilder

      一起学JAVA API Object String StringBuffer/StringBuilder1前言亲爱的小伙伴萌,目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢?其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~2什么是APIAPI(ApplicationProgrammingInterface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节.API是一种通用功能集,有时公司会将API作为其公共开放系统,也就是公司制定自己的

      2022年5月25日
      25
    • hash一致性算法以及应用场景_什么不是算法的基本特性

      hash一致性算法以及应用场景_什么不是算法的基本特性最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大家整理一下什么是Hash一致性算法,希望对大家有帮助!文末送书,长按抽奖助手小程序即可参与,祝君好运!经常阅读我文章的小伙伴应该都很熟悉我写文章的套路,上来就是先要问一句为什么?也就是为什么要有Has

      2022年10月6日
      0
    • 211高校导师解散微信群直言:和你们没感情,江湖不见!校方回应

      211高校导师解散微信群直言:和你们没感情,江湖不见!校方回应来源丨爆炸吧知识近日,哈尔滨工程大学一教授把他指导的63名学生的微信群就地解散了,解散群之前,他还在群里表示“和你们没有感情,永远不想和你们打交道,也不要找我问学科问题,江湖不见”。随后,…

      2022年5月19日
      60
    • SQL Server 2012 数据库备份还原「建议收藏」

      SQL Server 2012 数据库备份还原「建议收藏」文章目录1.数据库备份2.创建备份设备使用SSMS工具创建备份设备使用SQL方式创建备份设备3.完整备份与还原使用SSMS工具完整备份与还原使用SQL方式完整备份与还原4.差异备份与还原使用SSMS工具差异备份与还原使用SQL方式差异备份与还原5.事务日志备份与还原使用SSMS工具事务日志备份与还原使用SQL方式事务日志备份与还原1.数据库备份    数据库备份,即从SQLServer数据…

      2022年5月14日
      61
    • win10怎么查看端口占用_怎么查看端口是否关闭

      win10怎么查看端口占用_怎么查看端口是否关闭**Step1:**使用管理员模式打开命令提示符窗口Step2:进入窗口之后,输入netstat-ano命令,可以查看所有被占用的端口**Step3:**也可以使用netstat-ano|findstr80,查看具体端口号占用情况**Step4:**输入tasklist|findstr“80”命令,端口号加英文双引号,可以查找到具体进程**Step5:**找到具体的进程名称之后,可以到任务管理器—》详细信息页面,结束进程,释放端口…

      2022年7月27日
      5

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    关注全栈程序员社区公众号