Remoting简单实践

一句话概括

remoting是微软的一种实现在不同的.net应用程序中进行分布式通信的技术

重要概念

原理大致是首先客户端通过remoting通道来获取服务器对象代理,通过序列化与反序列方式实现数据交互

远程对象:服务器端的实现类必须继承MarshalByRefObject,进而实现remoting通信,支持跨程序域的访问

远程对象的激活

主要分为服务器端激活和客户端激活

交互前都需要激活相应的实例,便于调用方法
  通道:
  主要tcp,http,ipc这几种方式
  tcp通过二进制传输,传输效率高,局域网中适合用tcp

http:采用soap格式序列化消息对象,可以跨越防火墙,安全性较高,

IpcChannel:进程间通信,只使用同一个系统进程之间的通信,不需要主机名和端口号。而使用Http通道和Tcp通道都要指定主机名和端口号。

简单Demo

1.创建服务器端服务实现类

 public class MyRemotingObject : MarshalByRefObject
    {
        // 用来测试Tcp通道
        public int AddForTcpTest(int a, int b)
        {
            return a + b;
        }

        // 用来测试Http通道
        public int MinusForHttpTest(int a, int b)
        {
            return a - b;
        }

        // 用来测试IPC通道
        public int MultipleForIPCTest(int a, int b)
        {
            return a * b;
        }
    }

2.配置服务端remting服务

<?xml version="1.0" encoding="utf-8" ?>
<!--服务端App.config的内容-->
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown  mode="Singleton"
                    type="RemotingDemo.MyRemotingObject,RemotingDemo"
                    objectUri="MyRemotingObject"/>
      </service>
      <channels>
        <channel port="9001" ref="tcp"/>
        <channel port="9002" ref="http"/>
        <channel portName="IpcTest" ref="ipc"/>
        <!--Ipc通道不需要端口号-->
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

3.在服务器端程序入口启动加载配置文件,让它内部自己去注册启动服务

 RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, false);

4.客户端激活远程对象并调用相应方法

   MyRemotingObject proxyobj1 = Activator.GetObject(typeof(MyRemotingObject), "tcp://localhost:9001/MyRemotingObject") as MyRemotingObject;
            if (proxyobj1 == null)
            {
                Console.WriteLine("连接TCP服务器失败");
            }

            //HttpChannel httpChannel = new HttpChannel();
            //ChannelServices.RegisterChannel(httpChannel, false);
            MyRemotingObject proxyobj2 = Activator.GetObject(typeof(MyRemotingObject), "http://localhost:9002/MyRemotingObject") as MyRemotingObject;
            if (proxyobj2 == null)
            {
                Console.WriteLine("连接Http服务器失败");
            }

            //IpcChannel ipcChannel = new IpcChannel();
            //ChannelServices.RegisterChannel(ipcChannel, false);
            MyRemotingObject proxyobj3 = Activator.GetObject(typeof(MyRemotingObject), "ipc://IpcTest/MyRemotingObject") as MyRemotingObject;
            if (proxyobj3 == null)
            {
                Console.WriteLine("连接Ipc服务器失败");
            }
            // 输出信息
            Console.WriteLine("This call object by TcpChannel, 100 + 200 = {0}", proxyobj1.AddForTcpTest(100, 200));
            Console.WriteLine("This call object by HttpChannel, 100 - 200 = {0}", proxyobj2.MinusForHttpTest(100, 200));
            Console.WriteLine("This call object by IpcChannel, 100 * 200 = {0}", proxyobj1.MultipleForIPCTest(100, 200));
            Console.WriteLine("Press any key to exit!");
            Console.ReadLine();

总结

以前很惧怕去了解相关的技术,感觉非常难学,譬如说wcf,接下来我应该去实践wcf带来的乐趣!

时间: 2024-10-10 14:02:31

Remoting简单实践的相关文章

Android 设计随便说说之简单实践(合理组合)

上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示applist,和下载app.第二是运行环境,在Android平台,有androidsdk提供socket等API支持.因此将模块大体换发了5个模块.(当然了图片加载可以额外提出,用开源组件去做,但是这里为了说明如何设计,暂不提到.还有下载也可以利用开源组件)分别是如下: 模块1 UI模块,负责展示信息和用

SQL知识以及SQL语句简单实践

综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定义(Data Definition),数据控制(Data Control)于一体 即: SQL语言包含4个部分: ※ 数据定义语言(DDL),例如:CREATE.DROP.ALTER等语句 ※ 数据操作语言(DML),例如:INSERT(插入).UPDATE(修改).DELETE(删除)语句 ※ 数

Mysql 备份恢复的简单实践

一.备份: 进行mysql的安装目录: 使用./mysqldump -u root -h 127.0.0.1 -P 3306 -p mysql>trymysql.sql 输入密码,备份成功. 二.恢复 进行mysql. 创建数据库 create database trymysql; 进入数据库 use trymysql ; 恢复 source trymysql.sql Mysql 备份恢复的简单实践

GDB 程序调试简单实践

用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是很大,一般有错,直接看编译器编译结果就差不多知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows下面调试,但是总是不太方便,因此有必要看一下GDB调试方法和基本步骤. 下面是一个简单的演示: 首先创建一个有错误的代码,如下: 这个程序很简单,目的是接受用户的输入,并将用户的输入回应输出来. 但是这个程序的第17行有个错误,使用了未初始化的字符指针name,因此编译运行后会出现段错误,如下: 下面利用GD

ZooKeeper分布式锁简单实践

ZooKeeper分布式锁的实现原理 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁能够创建节点成功,谁就能够获取到锁.没有创建成功节点,就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁资源.如果请求超时直接返回给客户端超时,重新请求即可. 代码实现为了更好的展现效果,我这里设置每个线程请求需要1s,请求超时时间为30s. 首先我们先写一个测试类,模拟多线程多客户端请

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

WCF总结——宏观认识和简单实践

1.WCF是什么 WCF常和分布式系统以及面向服务(SOA)联系在一起,它可以使分布在不同服务器上的服务之间互相调用,访问.它提供了通信的模型和技术. 2.WCF基本概念 契约: 服务契约:可以看做是接口 数据契约:定义了在通信过程中用到的数据类型 服务:服务契约的实现类 宿主(托管):只有上面的东西,"服务"是不能运行和启动的.上述的契约和服务必须借助一个可执行的程序(Windows窗体应用程序,控制台应用程序等),才能启动服务,供外界调用 客户端:调用服务的一端. 3.WCF基本原

Android组件之BroadCast简单实践

作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源,接收者就是这些大妈和学生,程序源自实践,Android中BroadCast,有事件广播者也有事件接收者,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,也就是接收者.讲完了基本的概念,

jmeter简单实践(九)

简单版本的httpserver json模块可能需要下载,详细方法请百度,增加个人的能力 主要是json的,接收到非json的http请求,返回"415, "Only json data is supported." coding: utf-8 from http.server import BaseHTTPRequestHandler,HTTPServer import cgi import json def Cjson(datas): try: messages = js