• 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。

  • 相关阅读:
    深信服入职前编码训练21题--02
    深信服入职前编码训练21题--01
    Leetcode本地阅读器开发--01界面设计三
    Leetcode本地阅读器开发--01界面设计二
    Leetcode本地阅读器开发--01界面设计一
    使用DDMS测试安卓手机APP的性能(android)
    在PC上测试移动端网站和模拟手机浏览器的5大方法
    SeleniumIDE与eclipse如何连接使用
    Selenium RC配置
    Selenium IDE- 不同的浏览器
  • 原文地址:https://www.cnblogs.com/net-study/p/3483930.html
Copyright © 2020-2023  润新知