关于Remoting的个人使用心得

      最经几天比较闲写了一个基于Tcp网络通信的聊天程序,写的过程中实现了文件传输,可是却怎样也无法将文件名传送过去,期间想过用通信的端口发送文件的名称,但是又要自己定义一个协议,觉得那样比较麻烦,于是想到了Remoting。 

      于是就开始了Remoting的研究之路 ,只是简单的用了一下,也只是入门希望可以帮助到刚入门Remoting的同学们。

      在这里我写了一个模板类 ,你们拿去可以直接使用 废话不多说了 全是干货。

这是一个自己写的一个模版类

 1 using System;
 2 using System.Runtime.Remoting;
 3 using System.Runtime.Remoting.Channels;
 4 using System.Runtime.Remoting.Channels.Tcp;
 5 
 6 namespace NetChatLib
 7 {
 8     /// <summary>
 9     /// 用于Remoting的连接与释放
10     /// </summary>
11     public class Remoting_Helper
12     {
13         /// <summary>
14         /// 服务端激活Remoting
15         /// </summary>
16         /// <typeparam name="T">类的类型</typeparam>
17         /// <param name="port">端口号</param>
18         /// <returns></returns>
19         public bool Serivce<T>(int port)
20         {
21             //这里将通过反射获取T的类型的字符串 
22             T type = (T)Activator.CreateInstance(typeof(T));
23             //这里需要注意子类即使重写了GetType 也不行 
24             //系统调用的仍然是Object的GetTtpe
25             string str = type.GetType().ToString();
26             str = str.Split('.')[1];
27             try
28             {
29                 TcpServerChannel chnl = new TcpServerChannel("talkChannel", port);
30                 ChannelServices.RegisterChannel(chnl, true);
31                 RemotingConfiguration.RegisterWellKnownServiceType(typeof(T), str, WellKnownObjectMode.SingleCall);
32                 return true;
33             }
34             catch
35             {
36                 return false;
37             }
38 
39         }
40         /// <summary>
41         /// 客户端激活Remoting
42         /// </summary>
43         /// <typeparam name="T">类的类型</typeparam>
44         /// <param name="url">类型所在宿主位置</param>
45         /// <returns>该类的实例</returns>
46         public T Client<T>(string url)
47         {
48             try
49             {
50                 TcpClientChannel chnl = new TcpClientChannel();
51                 ChannelServices.RegisterChannel(chnl, true);
52                 T cls = (T)Activator.GetObject(typeof(T), url);
53                 return cls;
54 
55             }
56             catch
57             {
58                 return default(T);
59             }
60 
61         }
62     }
63 }

这是使用的方法 

客户端  DemoClass是我测试的一个类

1 static void Main(string[] args)
2 {
3     string url = "tcp://172.16.22.22:12346/DemoClass";
4     DemoClass cls = new Remote_help().Client<DemoClass>(url);
5     cls.SetName("你好世界");
6     Console.Read();
7 }

服务器端 

1 static void Main(string[] args)
2 {
3     new Remote_help().Serivce<DemoClass>(12346);
4     Console.WriteLine("服务开启");
5     Console.ReadKey();
6     Console.WriteLine(new DemoClass().GetName());
7     Console.ReadKey();
8 }

我的DemoClass测试类

 1 public class DemoClass : MarshalByRefObject
 2 {
 3     private int count = 0;
 4     private static string name;
 5 
 6 
 7     public void SetName(string name)
 8     {
 9         DemoClass.name = name;
10     }
11     public string GetName()
12     {
13         return DemoClass.name;
14     }
15 
16     public DemoClass()
17     {
18         Console.WriteLine("------DemoClassConstructor-------");
19     }
20     public void showCount(string name)
21     {
22         count++;
23         Console.WriteLine("{0} The Count is {1}", name, count);
24     }
25     public void showAppDomain()
26     {
27         AppDomain currentDomain = AppDomain.CurrentDomain;
28         Console.WriteLine(currentDomain.FriendlyName);
29     }
30     public int GetCount()
31     {
32         return count;
33     }
34 }

 最近使用发现了一个问题 :在不同计算机上启动Remoting服务失败的结果 

解决方法:将ChannelServices.RegisterChannel(chnl, true);true 改为false 

如果还是不行,就换Http协议进行传输就好了

原文地址:https://www.cnblogs.com/qulianqing/p/6567705.html