Remoting通讯实例

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。

原文地址:https://www.cnblogs.com/net-study/p/3483930.html