当前位置: 首页 > news >正文

关于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

相关文章:

  • 工作不顺心怎么办?——Leo网上答疑(57)
  • 操作系统版本
  • SQL中 NVARCHAR 和 VARCHAR 两者之间的优势与劣势
  • 学习进度条-第四周
  • OEM界面乱码
  • HTTP简介
  • proc 动态游标前3种方式的使用(第四种就是sqlda方式)
  • CCF 201609-4 交通规划
  • 奇妙的排序规则COLLATE
  • 安卓设置默认首先启动Activity
  • Visual Studio 2008 (VS 2008)无法打开 .aspx的解决办法
  • 百度文库开放平台-阅读器
  • javascript求日期差
  • LeetCode 132 Pattern
  • 资料分享-关于软件稳定性测试的思考与实践
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • IDEA常用插件整理
  • JAVA SE 6 GC调优笔记
  • java 多线程基础, 我觉得还是有必要看看的
  • OSS Web直传 (文件图片)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue2.0项目引入element-ui
  • Xmanager 远程桌面 CentOS 7
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 区块链技术特点之去中心化特性
  • 我与Jetbrains的这些年
  • 阿里云重庆大学大数据训练营落地分享
  • 关于Android全面屏虚拟导航栏的适配总结
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # 计算机视觉入门
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $L^p$ 调和函数恒为零
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (七)Knockout 创建自定义绑定
  • (算法)前K大的和
  • (五)网络优化与超参数选择--九五小庞
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)Linux下编译安装log4cxx
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • . Flume面试题
  • .a文件和.so文件
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件—git忽略文件
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 成都线下面基会拉开序幕
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 分布式技术比较
  • .net 受管制代码