当前位置: 首页 > news >正文

.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;

/*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() + "\t" + 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 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

 

转载于:https://www.cnblogs.com/woxpp/p/3997984.html

相关文章:

  • DHCP服务器的作用
  • 数据库索引的作用和长处缺点
  • Java 将自己定义的对象作为HashMap的key
  • SQL中declare申明变量
  • 常用命令
  • STL之容器适配器queue的实现框架
  • DNS添加/修改/查询/删除A记录
  • 大道至简 电话号码重新成为O2O新宠
  • tomcat日志catalina.out 按天分片分割
  • 【Android-视频播放】实用vitamio自定义控制条位置
  • HBase之MemStore+Flush详解
  • Pair Project 1 elevator
  • DISCUZ 学习笔记四 SEO 设置 板块 分区 导航 模板 修改浏览器标签powerbydis
  • JVM 运行时数据区域
  • JVM调优的几种策略(转)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Bytom交易说明(账户管理模式)
  • ESLint简单操作
  • GraphQL学习过程应该是这样的
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript 原型链
  • k8s 面向应用开发者的基础命令
  • Linux各目录及每个目录的详细介绍
  • MySQL主从复制读写分离及奇怪的问题
  • python docx文档转html页面
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 关于extract.autodesk.io的一些说明
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 力扣(LeetCode)357
  • 力扣(LeetCode)56
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 区块链共识机制优缺点对比都是什么
  • 如何编写一个可升级的智能合约
  • 微信小程序--------语音识别(前端自己也能玩)
  • 用Visual Studio开发以太坊智能合约
  • 智能合约Solidity教程-事件和日志(一)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #13 yum、编译安装与sed命令的使用
  • $NOIp2018$劝退记
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (0)Nginx 功能特性
  • (14)Hive调优——合并小文件
  • (C语言)fread与fwrite详解
  • (C语言)字符分类函数
  • (Forward) Music Player: From UI Proposal to Code
  • (二)WCF的Binding模型
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十三)Flask之特殊装饰器详解
  • (一) springboot详细介绍
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .cn根服务器被攻击之后
  • .NET 4.0中的泛型协变和反变