目录
  • .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.测试

    定义为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);
    }
    }
    }
    }

    运行结果

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

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

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

    【转载】.NET Remoting学习笔记(三)信道的更多相关文章

    1. .NET Remoting学习笔记(三)信道

      目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...

    2. 【转载】.NET Remoting学习笔记(二)激活方式

      目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科 ♂风车车.Net 激活方式概念 在访 ...

    3. 【转载】.NET Remoting学习笔记(一)概念

      目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...

    4. .NET Remoting学习笔记(二)激活方式

      目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科  ♂风车车.Net 激活方式概念 在 ...

    5. .NET Remoting学习笔记(一)概念

      目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...

    6. JSP学习笔记(三):简单的Tomcat Web服务器

      注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

    7. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

      回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

    8. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

      注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

    9. MYSQL学习笔记三:日期和时间函数

      MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

    随机推荐

    1. PAT Basic 1050

      1050 螺旋矩阵 本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件: ...

    2. Java实现——字符串分割以及复制目录下的所有文件

      0.  前言 今天有个需求,把Android中data/data目录下指定(通过读预置的XML文件)的多个应用下的多个目录全部内容通过OTG模式复制到U盘中. 首先读取XML文件内的某个节点的属性值, ...

    3. GDB使用例子

      GDB使用例子 一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点. ...

    4. iOS转场动画初探

      一般我们就用两种转场push和present present /** 1.设置代理 - (instancetype)init { self = [super init]; if (self) { se ...

    5. USACO Party Lamps

      题目大意:一排灯有n个,有4种开关,每种开关能改变一些灯现在的状态(亮的变暗,暗的变亮)现在已知一些灯的亮暗情况,问所以可能的情况是哪些 思路:同一种开关开两次显然是没效果的,那么枚举每个开关是否开就 ...

    6. 解决centos7中ens33中不显示IP等问题

      在虚拟机中安装centos7,输入ifconfig显示command not found.在sbin目录中发现没有ifconfig文件,这是因为centos7已经不使用 ifconfig命令了,已经用 ...

    7. 洛谷 [P2575] 高手过招

      SG函数+状压记忆化搜索 观察题目发现,每一行都是独立的,只要处理出来每一行的SG值,异或起来就好 每一行的SG值可以用状压+记忆化搜索的方法来求,对位运算技术是个很大的考验 注意SG值要预处理出来, ...

    8. C++函数传递指向指针的指针的应用

      传递指向指针的引用假设我们想编写一个与前面交换两个整数的 swap 类似的函数,实现两个指针的交换.已知需用 * 定义指针,用 & 定义引用.现在,问题在于如何将这两个操作符结合起来以获得指向 ...

    9. Andrew Stankevich's Contest (21) J dp+组合数

      坑爹的,,组合数模板,,, 6132 njczy2010 1412 Accepted 5572 MS 50620 KB C++ 1844 B 2014-10-02 21:41:15 J - 2-3 T ...

    10. 有关WebView开发问题(转)

      http://blog.sina.com.cn/s/blog_8241e8510101btvk.html 如何创建WebView: 1.添加权限:AndroidManifest.xml中必须使用许可& ...