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。