.NET Remoting——first things first(2):Channel信道

  Channel用于服务器端和客户端之间传输消息。当客户端调用某个远程对象的方法时,与该调用相关的参数以及其他详细信息会通过Channel传输到远程对象,并以同样的方式返回调用的任何结果。Channel在.NET Remoting框架中承担的主要职责如下:
        1. 建立管道
        为完成服务器端和客户端的消息传递,必须建立一个传输媒介——管道(因为Channel在很多地方被翻译是通道,所以为与通道区别,特定义管道)。管道分别物理上的和逻辑上的。物理管道已经无处无在,物理管道主要有:内存(主要完成进程之间的通讯)、LAN、WAN、无线、USB等)。逻辑管道主要有:IP地址、MAC地址、硬件地址等。
        建立管道通常是由硬件和操作系统来完成,而且.NET Framework已经做了很多很好的封装和处理,.NET Remoting只需简单调用即可,开发人员甚至可以不必关心建立管道的工作,.NET Remoting会根据传输协议自动建立管道。
        2. 选择协议
        管道建立好之后,为能够让服务器端和客户端都准确的识别消息内容,同时也为了保证在管道中传输过程中的安全性、稳定性和完整性,还有速度要求,服务器端和客户端都需要指定同一个Protocol。.NET Remoting支持的协议有:Tcp、Http、Ipc(Windows 操作系统的进程间通信协议)。当然,选择何种协议还要考虑管道的类型。开发人员也可以根据应用需要,自定义协议,但都必须继承IChannel接口。协议比较结果如下图:
协议比较结果
        代码实例:
        //创建Tcp信道
        TcpChannel channel = new TcpChannel();//获取本机信道逻辑信息和指定传输协议。
        .NET Remoting还提供了TcpClientChannel类和TcpServerChannel类。这两个类与TcpChannel类基本差不多。因此,在开发过程中,推荐在服务器端和客户端直接使用TcpChannel类来创建对象,不必在分别使用TcpServerChannel和TcpClentChannel。Http信道和Ipc信道创建方法与Tcp信道创建方法相同(以下代码实例都将使用Tcp应用场景。若有特殊之处,才会特别指出)。在创建和使用对象之前,必须在项目中添加System.Runtime.Remoting.Channels.Tcp、System.Runtime.Remoting.Channels.Http或System.Runtime.Remoting.Channels.Ipc的引用,否则会出现无法使用TcpChannel、HttpChannel和IpcChannel。
        3. 侦听端口
        在服务器端硬件上,通常会运行多个进程,这些进程有可能同时都在发送或接收消息。因此,为了能将消息及时准确转发给相应的进程,就必须为各个进程指定端口,这些端口都会以独占模式被各个进程所使用。
代码实例
        //创建服务器端管道并指定端口
        TcpChannel channel = new TcpChannel(8891);
        IpcChannel channel = new IpcChannel(“localhost:8891”);//因为Ipc不是基于IP网络,所以无法直接自动获得IP地址。
        在创建服务器端管道对象时,必须指定端口,而且必须告之客户端,在提供服务期间,端口一般不能更换端口。因为服务器端通常是以服务的方式接收不同的客户端发送过来的消息,并且以同一个端口将消息处理结果返回给客户端。好比我们去银行存款,我们就必须知道银行的地址,而且柜台必须有人,不然我们就无法完成存款。
        //创建客户端管道并指定端口
        TcpChannel channel = new TcpChannel();
        在创建客户端管道对象时,可以不必指定具体的端口,虽然构造函数没有参数,但是在创建时,会使用默认端口0(TcpChannel(int port))。因为客户端通常是以请求者的身份向服务器端发送服务请求,不直接接收消息。当客户端创建远程对象时,操作系统会为对象动态分配一个端口,并以此端口发送消息并接收消息,直至远程对象消毁。比如:我们去银行存款,我们可以随时搬家,但我们仍然可以享受银行提供的存款服务。
        4. 注册信道
        当完成创建管道、指定协议和端口时,也就完成了信道的整个创建工作。下面,就可以向操作系统注册这个信道,以便让操作系统发送和接收消息。
代码实例:
        //注册信道(服务器端和客户端方法相同)
        ChannelServices.RegisterChannel(channel, true);//不建议使用ChannelServices.RegisterChannel(channel);因为这样,不能确保这个信道的安全。
        5. 注销信道
        当不再使用远程对象或进程退出时,需要注销该信道,以便让其它进程使用。
代码实例
        //注销信道(服务器端和客户端方法相同)
        ChannelServices.UnregisterChannel(channel);
        注册信道是分布式开发的基础性工作。只有成功创建并注册了信道,才能真正在服务器端和客户端建立起消息传输的“道路”。桥梁建好之后,才能去考虑在信道中传递什么样的消息?怎样去传递消息?好比要发展先修路,道理是一样的。若没有.NET Remoting,开发人员必须了解协议、操作系统、硬件等底层的知识,才能完成创建和注册信道的工作。幸运的是.NET Remoting已经为开发人员都做好了,开发人员只需根据应用需要,直接使用TcpChannel、HttpChannel和IpcChannel类创建对象,并使用ChannelServices类的静态方式将这个对象注册到操作系统中或从操作系统中注销这个对象。所有工作只需要两行代码即可完成之前需要大量代码才能完成的工作。若在服务器端和客户端使用配置文件储存信道信息,只需要使用RemotingConfiguration类的Configure静态方法即可以所有创建和注册信道的工作。服务器端和客户端信道构成及关系如下图:
信道构成及关系
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值