初探remoting双向通信(一)
初探remoting双向通信(一)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kkkkkxiaofei/article/details/9162911 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<div class="htmledit_views" id="content_views">
我始终认为,在项目中边学边用才能将某项技术真正掌握,才能真正理解。最近做了个项目,简单介绍下:主要用Winform,内嵌有百度和谷歌2种类型的地图,此为服务器端。客户端是由另外一家公司做的一个板子,通俗点说就是GSM+GPS,可以利用TCP实时的给地图上传各种信息。客户端是安装的每辆行驶在高速公路的车辆上的,以此实现对高速公路安全的预警和监控。现在项目第一版已经差不多了,要去给客户安装软件。可问题来了,值班室可能有5-8个人要使用软件,而且其中一个还要安装在大屏幕上。呢就必须让这几个软件同步执行,当一个车辆上传坐标时,应该同时出现在8个机子上才对,当有一个机子的值班人员需要在地图上标记一个预警信息时,其他7个机子也应该同步更新信息才对。为此,我就开始了我的Remoting学习之路。
一、从一个小例子开始
我想这种方式是现今大多数程序员最喜欢的方式了。“只要有DEMO,就别跟我说技术,是不?”哈哈,都是百度程序员。好了我就用百度程序员的方式开始,下面用某位仁兄的例子开始,这也是我网上搜的:
1.0定义对象
-
namespace RemoteSample
-
{
-
public class RemoteObject : System.MarshalByRefObject
-
{
-
public RemoteObject()
-
{
-
System.Console.WriteLine("我被构造了!");
-
}
-
public int sum(int a, int b)
-
{
-
return a + b;
-
}
-
}
-
}
将其编译为一个lib文件:csc /t:library RemoteObjec.cs
2.0服务器端
-
using System;
-
using System.Runtime;
-
using System.Runtime.Remoting;
-
using System.Runtime.Remoting.Channels;
-
using System.Runtime.Remoting.Channels.Tcp;
-
using RemoteSample;
-
namespace RemoteSampleServer
-
{
-
public class RemoteServer
-
{
-
public static void Main(String[] args)
-
{
-
TcpServerChannel channel =new TcpServerChannel(6666);
-
ChannelServices.RegisterChannel(channel);
-
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject),
-
"RemoteObject", WellKnownObjectMode.SingleCall);
-
System.Console.WriteLine("Press Any Key");
-
System.Console.ReadLine();
-
}
-
}
-
}
-
将其编译为一个exe文件:csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteServer.cs
3.0客户端
-
using System;
-
using System.Runtime.Remoting;
-
using System.Runtime.Remoting.Channels;
-
using System.Runtime.Remoting.Channels.Tcp;
-
using RemoteSample;
-
namespace RemoteSampleClient
-
{
-
public class RemoteClient
-
{
-
public static void Main(string[] args)
-
{
-
ChannelServices.RegisterChannel(new TcpClientChannel());
-
RemoteObject remoteobj = (RemoteObject)Activator.GetObject(typeof(RemoteObject),
-
"tcp://localhost:6666/RemoteObject");
-
Console.WriteLine("1 + 2 = "+ remoteobj.sum(1,2).ToString());
-
Console.ReadLine();
-
}
-
}
-
}
同样的,将其编译为exe文件:csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteClient.cs
然后先运行RemoteServer.exe,再运行RemoteClient.exe
输出:
我被构造了!(server端)
3(client端)
假如你身边有2台电脑,再试试把其中的"tcp://localhost:6666/RemoteObject"改为一个具体的IP地址,如"tcp://59.74.137.215:6666/RemoteObject";之后将RemoteServer.exe和RemoteObject.dll拷贝后,在一台电脑上运行。再将RemoteClient.exe和RemoteObject.dll拷贝后再另一台电脑里运行。运行的结果和上面一样。这时我就有疑问了:
1.客户端获得的remoteobj,到底是怎么来的。
2.remoteobj调用的方法是谁的?服务器还是客户端?
3.这么做有什么意义?
先从第1个开始着手。我很好奇这个dll起的作用。为什么客户端和服务器都需要一份dll?从上面的运行结果来看,server端既然能执行构造函数,那说明对象一定是再server端创建的,只是说客户端用某种方式获取了这个对象的引用。这样的话我就推测问题2一定是调用的服务器端的方法。那么,客户端的dll到底有什么用呢?如果不放这个dll我想连语法都通过不了把,RemoteObject
remoteobj = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://localhost:6666/RemoteObject");这行里的RemoteObject肯定就需要dll来声明。嘿嘿,我就猜想,它绝对只是声明的作用,为了验证我对1,2问题的猜想。其中运行server端那台的机子代码不变,客户端的机子中代码稍稍改变下,将RemotingObject重新按以下代码编译。
-
namespace RemoteSample
-
{
-
public class RemoteObject : System.MarshalByRefObject
-
{
-
public RemoteObject()
-
{
-
System.Console.WriteLine("我被构造了!");
-
}
-
public int sum(int a, int b)
-
{
-
return 0;//返回0
-
}
-
}
-
}
-
然后替换掉客户端机子上的那个dll,注意此时客户端和服务器端的dll不一样奥。也许你已经看出了猫腻,哈哈,运行下把。
输出:
我被构造了!(server端)
3(client端)
我了个去,坑爹了把。这东西确实是调用的服务器端的方法,虽然在客户端运行着,但是跟客户端没半毛钱关系。前两个问题算是勉强解决了,再说解决第三个问题的时候,我是时候该看下到底什么是remoting的,这个共享的对象又是怎么获取的。我虽然很喜欢搜百度,但遇到技术问题很少去看百度百科,说一大堆废话。不过关于remoting的介绍,这个百科说的还真不错,后来我发现这个百度百科也是抄的(谁先谁后不知道奥),在博客园里找到了"虾皮",貌似这是原创(以下摘自百科)。
Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。
看了这么多的资料,也了解了些remoting,是时候说第3个问题了。还是想不通这又有什么意义呢?服务器中有某个方法可供客户端调用,那我还不如两边都using一下这个dll,还搞什么remoting这么麻烦的干嘛啊。初看起来确实是这样的。但是仔细想想,问题出在上面的代码太过于简单了。因为上面的代码调用的方法都是写死的,对象就在服务器停留了一小会调用了一下方法就走了,和服务器其实没有太大的联系。可是别忘了,.net有委托,有事件啊。如果注册的对象里面是有事件的,那么我在客户端触发该事件,而服务器订阅该事件,那岂不是作用大了去了。这似乎和我的项目需求沾边了,很高兴。。。继续研究ing,下篇继续。
初探remoting双向通信(一)的更多相关文章
- 初探Remoting双向通信(四)
原 初探Remoting双向通信(四) 2013年06月26日 11:11:32 喜欢特别冷的冬天下着雪 阅读数 2632 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- 初探Remoting双向通信(三)
原 初探Remoting双向通信(三) 2013年06月25日 17:51:08 喜欢特别冷的冬天下着雪 阅读数 4741 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- 初探Remoting双向通信(二)
原 初探Remoting双向通信(二) 2013年06月25日 11:46:24 喜欢特别冷的冬天下着雪 阅读数 2977 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- C# 实现Remoting双向通信
本篇文章主要介绍了C# 实现Remoting双向通信,.Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象来实现通信的 闲来无事想玩玩双向通 ...
- C# Remoting双向通信
闲来无事想玩玩双向通信,实现类似QQ的互发消息的功能.于是乎开始学习.Net Remoting. .Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为 ...
- .Net Remoting的双向通信和Windows Service的宿主服务
原文:.Net Remoting的双向通信和Windows Service的宿主服务 作为微软分布式技术之一的.Net Remoting,从性能.安全等各方面来说都是相对比较稳定的,也是一项比较成熟的 ...
- WCF初探-15:WCF操作协定
前言: 在前面的文章中,我们定义服务协定时,在它的操作方法上都会加上OperationContract特性,此特性属于OperationContractAttribute 类,将OperationCo ...
- .Net remoting, Webservice,WCF,Socket区别
传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...
- C#NetRemoting双向通信
闲来无事想玩玩双向通信,实现类似QQ的互发消息的功能.于是乎开始学习.Net Remoting. .Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为 ...
随机推荐
- GMTC全球大前端技术大会-未来已来
GMTC-2019北京 GMTC这次的大会的热词肯定是监控.性能,当然跨平台依然是热点,write once,run anywhere!,以下是自己参加的总结心得. 6.20上午 前端的演化 核心理念 ...
- 【BZOJ2138】stone
题目 好厉害的题啊 这道题不难看成一个二分图模型,但是给人一种求最大匹配的感觉,这实在不是很好求的样子,于是自闭了 但是不妨这样来考虑,对于一个需求\(k_i\),我们求一个最大的\(x\leq k_ ...
- RabbitMQ 在 Win10 环境下的安装与配置
1 RabbitMQ 环境配置 1.1 ErLang 下载安装 RabbitMQ 需要 ErLang 环境支持:首先下载 ErLang 并安装. 建议使用新版本,版本过低存在与 Rab ...
- 基于Windows 7(本地)和CentOS7.6(云端)的Minecraft服务器(无Forge/有Forge)搭建方法
炎炎夏日中想和小伙伴们开黑的同学可以进来看一下了,本教程教你搭建基于两个平台的Minecraft服务器,这里我以Minecraft 1.11.2版本为例给大家讲解搭建流程.其中有Forge版本可以加入 ...
- NFS 共享存储实战
目录 NFS 共享存储实战 一.NFS概述 二.NFS部署 部署NFS客户端backup和web01 统一web.nfs.backup的用户权限 代码部署步骤 三.NFS配置详解 NFS存储小结 四. ...
- 以python为例讲解闭包机制
以python为例讲解闭包机制 缘起 在学习JS的过程中,总是无可避免的接触到闭包机制,尤其是接触到react后,其函数式的编程思想更是将闭包发扬光大,作为函数式编程的重要语法结构,python自然也 ...
- IDA技巧
3. 用[shift+F12]调出字符串表,再根据这些字符串,查看引用的地方,也可以分析出一些sub_0XXXX函数的功能. 进入import函数内 x查看调用处 jump to xref 跳到引用 ...
- Windows 命令提示符
命令提示符(cmd): 启动:Win+R ,输入cmd回车 切换盘符:盘符名称: 进入文件夹:cd 文件夹名称 进入多级文件夹:cd 文件夹1\文件夹2\文件夹3 返回上一级:cd .. 直接回根路径 ...
- webpack学习(一)起步安装
起步 webpack 用于编译 JavaScript 模块.一旦完成安装,你就可以通过 webpack 的 CLI 或 API 与其配合交互.如果你还不熟悉 webpack,请阅读核心概念和打包器 ...
- MySQL解决插入数据乱码问题
首先配置 my.ini 如果没有将原来的 my-default.ini 备份出一个 修改my.ini [1]在[client]节点下添加 (这个如果是另一种character_set_server=u ...