Remoting通讯可以实现不同应用程序域之间的通信(可以为一台机器不同程序,也可以不同机器上的不同程序)

实例步骤:

(1)编写透明代理类

新建一个类库,命名空间:MyRemoting

在该类库中建立一个接口,IMyrem和代理类MyObj

代码:

接口代码IMrem.cs

namespase MyRemoting
{
public deledate void MyHandler(string str); //定义无返回值的自定义委托,用于构建调用事件
public delegate string MyStrHandler(string str); //有返回值的委托
public interface IMyrem
{
void Print(string str);
string PrintStr(string str);
}
}

代理类代码 MyObj.cs

namespace MyRemoting
{
public class MyObj:MarshalByRefObject,IMyrem //代理类必须继承自MarshalByRefObject来实现跨越应用程序域
{
public event MyHandler MyEvent; //定义事件
public event MyStrHandler MyStrEvent;
public void Print(string str)
{
if(MyEvent!=null)
{
MyEvent(str); //如果事件存在,触发事件
}
}
public string PrintStr(string str)
{
if(MyStrEvent!=null)
{
MyStrEvent(str);
}
} }
}

(2)编写服务端

新建控制台应用程序(添加MyRemoting类库引用)

代码如下

namespace MyService
{
class Program
{
static void Print(string s)
{
Console.WriteLine(s);
}
[STAThread]
static void Main(string[] args)
{
TcpServerChannel tcp = new TcpServerChannel(8080);//建立tcp通道 端口8080
ChannelServices.RegisterChannel(tcp, false); 注册通道
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemoting.MyObj), "middle", WellKnownObjectMode.SingleCall);//激活远程对象,设置uri(uri为“middle”)
MyRemoting.MyObj.MyEvent += Print;//注册事件
MyRemoting.MyObj.MyStrEvent+= delegate(string s) { return "经过服务处理:"+s; };//利用匿名方法注册事件
Console.WriteLine("Service Start!");
Console.ReadKey();
}
}
}

(3)客户端代码

新建控制台应用程序(添加MyRemoting类库引用)

namespace MyClient
{
class Program
{
[STAThread]
static void Main(string[] args)
{
TcpClientChannel tcp = new TcpClientChannel(); //建立通道
ChannelServices.RegisterChannel(tcp, false); //注册通道
//获取远程的透明代理对象 通道的端口和ip以及uri都在这里
MyRemoting.IMyrem obj = (MyRemoting.IMyrem)Activator.GetObject(typeof(MyRemoting.IMyrem),"tcp://localhost:8080/middle");
//(这里获得的是接口的对象,因为透明代理类继承自这个接口,当然也可以直接获取代理类,修改代码为:
// MyRemoting.MyObj obj= (MyRemoting.MyObj)Activator.GetObject(typeof(MyRemoting.MyObj), "tcp://localhost:8080/middle");
while (true)
{
string s = Console.ReadLine();
obj.Print(s); //调用远程方法
Console.WriteLine(obj.Show(s));//调用远程方法并返回数据
}
//Console.ReadLine();
}
}
}

(测试运行)

先启动服务端程序,然后再启动客户端程序,OK。

Remoting通讯实例的更多相关文章

  1. 在windows下用C语言写socket通讯实例

    原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #in ...

  2. .NET Remoting 应用实例

    前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...

  3. node.js和socket.io纯js实现的即时通讯实例分享

    在这个例子中,其实node.js并没有真正起到服务器的作用,因为我们这里可以直接运行client.html文件,而不用输入url请求,当 然,要想输入url请求页面内容还需要加入请求静态文件的代码.这 ...

  4. AIDL机制实现进程间的通讯实例

    转载自:http://blog.csdn.net/cjjky/article/details/7562652 ======================================= 在Andr ...

  5. socket通讯实例与TCP/UDP的区别

    一.socket代码实例 1.简单的socket通讯: 服务端代码实例: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_ ...

  6. WCF之.NET Remoting通讯

    一.NET Remoting 介绍 简介 .NET Remoting与MSMQ不同,它不支持离线可得,另外只适合.NET平台的程序进行通信.它提供了一种允许对象通过应用程序域与另一个对象进行交互的框架 ...

  7. Socket通讯实例-基本Socket

    转自:http://www.cnblogs.com/mahaisong/archive/2011/07/25/2116475.html (讲的很好,很细) 参考:http://blog.sina.co ...

  8. C#串口通讯实例

    本文参考<C#网络通信程序设计>(张晓明  编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...

  9. 利用node.js来实现长连接/聊天(通讯实例)

    首先: 需要在服务器端安装node.js,然后安装express,socket.io这两个模块,并配置好相关的环境变量等. 其次: 服务端代码如下: var app = require('expres ...

随机推荐

  1. PL/SQL 动态SQL

    declare msql varchar2(200); row_id varchar2(200); begin loop row_id := 'AAATGiAAEAAAuLLAAA'; msql := ...

  2. Wormholes 最短路判断有无负权值

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  3. 进程间通讯aidl

    进程间通讯(aidl) 1.首先定义一个接口 2.把这个接口的文件扩展名改为xxx.aidl 3.写一个MyService类继承自Service类重新里面的方法, 4.在MyService类定义一个内 ...

  4. SDL_PingGe 1.2

    加入了像素填充函数,必须要在一个指定颜色的边界范围内,边界必须没有缺口. 加入了鼠标类 /* typedef void (*FUNCTION)(void); HMODULE HDll; HDll = ...

  5. 辛巴达:帮电商打造ZARA式开放供应链体系 - 行业网站 - 亿邦动力网

    辛巴达:帮电商打造ZARA式开放供应链体系 - 行业网站 - 亿邦动力网 辛巴达:帮电商打造ZARA式开放供应链体系

  6. Back to Basics: Using KVO

    One of the things I like most about Apple’s iOS SDK is the consistent and easy-to-use API they provi ...

  7. java并发ThreadLocal

    ThreadLocal 实际就是一个map,一个线程对应一个local对象,线程创建时候,threadlocal随着创建,线程死亡ThreadLocal对象随着消失. runnable可以共享数据,要 ...

  8. jquery and js 判断一个元素是否存在

    一.javascript中判断一个元素是否存在 if(document.getElementById('example')){ // do sth } 二.jquery中判断一个元素是否存在 < ...

  9. IOS--跳转方式两种

    带导航栏的Push跳转: FloatPassViewController *floatpass = [self.storyboard instantiateViewControllerWithIden ...

  10. 告诉你LTE-FDD与LTE-TDD的区别

    [PConline 技术分析]移动早在去年已经拿下了TD-LTE的4G牌照,而中国联通与中国电信的FDD-LTE的牌照在近日正式拿下,而对于4G网络,有多少真正了解呢?接下来笔者就为大家解释一下4G的 ...