如何在程序之间进行485通信程序

C#如何实现本地的两个程序间的通讯?_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C#如何实现本地的两个程序间的通讯?
&&C#如何实现本地的两个程序间的通讯?
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩12页未读,
定制HR最喜欢的简历
你可能喜欢他山之石,可以攻玉
应用程序之间互相通讯的几种方法
()一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。
1、共享 在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。
2、DDE 每个Windows程序员都不会对DDE(动态)感到陌生,它是最早的基于Windows的方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。
DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。
3、WM_COPYDATA
Windows消息功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我们为什么不把数据放在消息中一起发送出去呢?这样,我们只要调用SendMessage(),以对方窗体的句柄作为第一个参数,以含有指向实际数据的指针结构的地址作为第二个参数,就可以把整个数据块当作消息发向另一个应用程序。也许有的程序员会说,一个自定义的消息同样可以完成这样的工作。他只说对了一半。自定义消息的确可以发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程中才是合法的,若在其它模块中存取该内存区就会导致“Access Violation”。而使用 则不存在这个问题,因为Windows 本身会替你处理这一切。深入钻研下去,你会发现它其实是先创建了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,然后再在接收方对这个映射文件打开一个“视图”。 的不足之处在于:必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源)。
4、NetBIOS 从80年代开始,NetBIOS就是开发Client/Server类程序的标准接口。而当时其它的解决方案几乎都是从UNIX系统上发展而来的。当然,对于今天的用户而言,NetBIOS已不是唯一的选择,他们可以从各种方案中择优选取。在Windows 95和NT平台上,可以通过API函数Netbios()来调用NetBIOS功能。
NetBIOS兼容以下几种低层协议:NetBEUI协议(NBF)、NWLink NetBIOS(NWNBlink)、NetBIOS over TCP/IP(NetBT)。NetBIOS的优点是速度较快,缺点是可靠性较差。
5、标准的Sockets和WinSock
Sockets是15年前在UNIX系统上提出来的,一开始主要是用于本地通讯,但很快就应用在Client/Server体系上了。它的内核很简单:你可以将一个Socket看作是一个双向的节点,一个应用程序可以通过它先与另一个程序建立连接(建立在一个双方都认可的端上,以便于区分同时运行的几个通讯线程),然后就可以彼此交换数据了。
微软公司在其基础上创建了WinSock,专门用于Windows接口,与Socket完全兼容。近年来基于TCP/IP协议的网络大行其道,Socket也随之获得了更加广泛的应用。
如今,Sockets已在Internet上获得了最广泛的应用,主要是因为它的可移植性好:
Socket应用程序无论在任何平台间都能互相进行通讯(不管是PC机还是Macintosh,也不管是Windows平台还是UNIX平台)。而最新推出的WinSock 2.0,已不仅仅只基于TCP/IP协议,还可基于其它几种传输协议(如IPX)。
Socket的缺陷是它工作在通讯的低层,所以实现起来较为复杂(如果是Win 95或NT平台,则不存在这个问题,微软公司提供了相应的控件)。但是,如果要在多个平台间,则Socket是不二之选。
6、Mailslot和Pipe Mailslot和Pipe有很多相同点,即都是高层的、基于内存的通讯系统。Mailslot由Server端创建,代码如下:
myMailslot = CreateMailslot(pSlotName, 0, MAILSLOT_WAIT_FOREVER, NULL);
然后,Client端就可以像打开文件一样打开这个Mailslot,再通过API函数WriteFile()来将数据写入到消息队列中。
与此相类似,Pipe也是由Server端创建的,代码如下:
pipe = CreateNamedPipe(pPipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE |PIPE_READMODE_MESSAGE
| PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE,BUFSIZE, 20000, NULL);
接着,Client端就可以通过一般的文件API读写数据,代码如下:
pipe = CreateFile(pPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0,NULL); success = WriteFile(pipe, pMessage, strlen(pMessage) + 1, &bytesWritten, NULL);
Pipe分两种,即命名Pipe和匿名Pipe。匿名Pipe是以句柄而不是以名字来进行标识的,因而也就限制了它只能在同一台机器上通讯,而不能应用于网络。命名Pipe则提供了以名字来进行标识,所以能在网络上的其它任何地方打开它。需要注意的是:命名Pipe只能在 Win NT而不是Win 95上创建(即Server端),Client端则可以是任意平台。
Pipe既可以单向通讯也可以双向通讯,Mailslot则只能单向通讯。Client端可以发送消息给mailslot,但不能接收消息;如果你想要接收消息,则只能创建一个新的mailslot。但mailslot有一个很大的优点:它支持数据广播。也就是说,若Client端发送一条消息,则整个网络中的同名对象都能收到。这是因为mailslot的名字的作用域只是在本台机器上,所以可在不同机器上创建同名的mailslot,当Client端发来消息时则每一台机上的mailslot都得到了该消息的一份拷贝,并在本机上作出相应的反应。Mailslot的最大缺陷是不可靠,因为它的数据是以数据报格式来传送的,网络错误或负荷过重都会导致数据丢失。
Pipe则较为可靠,但它不能广播。所以,如果你不需要进行广播,则Pipe是更好的选择。选择Mailslot,则要对此后遇到的麻烦有充分的准备。
7、剪贴板(Clipboard)
大家对Windows的应该不会感到陌生吧?它的出现就是为了实现应用程序间的互相。Windows提供了一系列的API函数来让应用程序安全地打开,读写其中的数据。
的缺陷也是显而易见的:当有新的数据放在上时,则先前的数据就会被冲掉,而在Windows中用到的时候又实在太多了,所以这种方式用于程序间的通讯显然不够安全。
8、COM和DCOM 公共对象模式(COM)是一种协议,它建立了一个软件模块同另一个软件模块之间的连接,然后将其描述出来。当这种连接建立起来之后,则两个模块之间就可以通过称为“接口”的机制来进行通讯。COM可以用不同的语言(VB、VC、Delphi)进行编制,又能被其它语言编写的程序所使用,并且不用管通讯双方实际所处的位置(是在同一台机上,还是在同一个网络上的不同机上)。事实上,Internet上有大量的COM控件可供人们下载使用,其中有相当一部分就是用于应用程序间的相互通讯(甚至是Internet程序间的通讯),硬盘上能够看到的大量的.ocx文件其实就是一种COM。
COM对象为外部调用提供了一个标准的界面,COM Client通过创建COM Server的一个实例获得指针,转向所需的函数定义处并执行相应的程序。讲得通俗一点,也就是先正确定义好COM对象的属性(Property),再执行相应的方法(Method)。
DCOM(分布式公共对象模式)是COM在网络上的一种扩展,它通过把分布式对象间的通讯变成一个实体来实现通讯。
COM如今被微软公司大力提倡,最著名的有OLE、ActiveX、DirectX和Win95、WinNT的外壳。由于微软公司目前在软件业处于霸主地位,所以COM很有可能成为将来的业界标准,其前途也较为看好。但COM的庞大也会使一些经验丰富的程序员望而却步,他们宁可自己多写一些代码以使整个程序更为简洁、有效而不愿使用COM。
以上介绍的只是现今流行的一些通讯方法,它们各有各的优缺点,没有哪一种是万能的。因此,只有在合适的场合采用合适的方案,才是最好的解决办法。
关于C#中实现两个应用程序消息通讯的问题
两不同程序之间通讯
C++中进程间相互通信的十一种方法(转)
请问在两个程序之间如何通信?
进程间通讯方式以及各个方式的优缺点
没有更多推荐了,不同的Server程序实例间如何通信-Swoole-Swoole文档中心
不同的Server程序实例间如何通信
有2种方法可以实现不同的Server程序实例间通信。
额外监听一个UDP端口
额外监听一个UDP端口并设置onPacket回调,接收来自其他Server发来的消息
UDP通信不是可靠的,消息可能会丢失。需要应用层发送消息接收回执
UDP通信不存在阻塞IO
使用swoole_client作为客户端访问Server
在Server程序中创建一个TCP客户端,连接到另外一个Server程序。实现Server与Server之间通信。TCP客户端需要实现对端Server约定的通信协议。可使用Server::getClientInfo得到客户端连接的来源IP实现安全防护机制。
TCP通信时可靠的可以保证安全性
创建TCP客户端连接是推荐的做法,异步Server中创建一个异步的TCP客户端可以保证整个Server程序是纯异步的两个程序之间如何通信
[问题点数:20分,结帖人ndscndscnd]
本版专家分:1
结帖率 96%
CSDN今日推荐
本版专家分:41870
2012年10月 Delphi大版内专家分月排行榜第一2012年9月 Delphi大版内专家分月排行榜第一2012年8月 Delphi大版内专家分月排行榜第一2012年7月 Delphi大版内专家分月排行榜第一2012年6月 Delphi大版内专家分月排行榜第一2012年5月 Delphi大版内专家分月排行榜第一2011年12月 Delphi大版内专家分月排行榜第一
2012年4月 Delphi大版内专家分月排行榜第二2012年3月 Delphi大版内专家分月排行榜第二2012年1月 Delphi大版内专家分月排行榜第二2011年11月 Delphi大版内专家分月排行榜第二
2012年2月 Delphi大版内专家分月排行榜第三
本版专家分:26979
2012年12月 Delphi大版内专家分月排行榜第三2012年11月 Delphi大版内专家分月排行榜第三
本版专家分:26979
2012年12月 Delphi大版内专家分月排行榜第三2012年11月 Delphi大版内专家分月排行榜第三
本版专家分:16106
2012年4月 Delphi大版内专家分月排行榜第一2012年3月 Delphi大版内专家分月排行榜第一
本版专家分:1
本版专家分:137
本版专家分:9129
本版专家分:1924
本版专家分:11621
本版专家分:20
本版专家分:4373
2014年9月 Delphi大版内专家分月排行榜第一2014年8月 Delphi大版内专家分月排行榜第一2014年7月 Delphi大版内专家分月排行榜第一
匿名用户不能发表回复!|
其他相关推荐
应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。
  1、共享
  在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便
两个Java项目,要实现他们之间进行信息的通信
前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径。
其实两个java项目之间的通信还是使用HTTP的请求。主要有两种方式:
①使用apache的HttpClient方式。
②使用JDK自带的java.NET包下的HttpURLConnection方式。
HttpURLConnection方式:
C#两个或者多个窗体之间值得传递方法有很多种,大致可以分为单向传递和双向传递两种,后者当然更加灵活一点,对于C#的特点体现的也最好。这里总结两种最为常用的方法,通过属性设置和事件委托进行通信。
1、事件委托
我们可以做两个窗体Form1,Form2来实现两个整数的相加求和,其中前者负责输入第一个整数,通过点击事件弹出第二个窗体,在第二个窗体中设置第二个整数,再返回整数给第一个窗体
int main(int argc, char *argv[])
setbuf(stdout,NULL);
shmid = shmget(,
今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。
现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。
一个进程打开管道的读,另一个进程就打开管道的写。
int fdr=open(“1”,O_RDONLY);
if(-1 == fdr)
perror(“open dr”);
本文以STM32F103为例展示两块STM32之间的SPI通信。废话少说,直接奉上我写的SPI库吧。
首先是 SPI.h
#ifndef _SPI_H_
#include &stm32f10x.h&
void RCC_Configuration(void);
void GPIO_Configuration(void);
在没学c# .net socket编程之前。感觉实现这个好难,一点眉目都没有。
但是,真的下决心去学以后。看一看基础,看一看前人的思路,实际的例子。稍稍用点心,体会体会,自己写几遍,就掌握了。然后,觉得好简单啊。如果当初 有畏难情绪,一直不下决心开始。那么,现在,依然觉得是难的,没有一点头绪,不知如何下手。
想做,有必要做,需要做,那就去做。下定决心,咬定青山不放松,想法设法去做到。就做到了。
这个风格不仅适用于计算机网络编程的学习。也适用于任何想做要做又没做过的事。
本例程适合于刚开始接触stm32spi的程序员
本程序配备有详细的注解
c#窗体通信
两个java项目,他们之间进行信息的通信
前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径。
其实两个java项目之间的通信还是使用HTTP的请求。主要有两种方式:
①使用apache的HttpClient方式。
②使用JDK自带的java.net包下的HttpURLConnection方式。
HttpURLConnection方式:微信小程序页面间通信的5种方式
转载 &更新时间:日 10:44:43 & 作者:u3xyz
这篇文章主要介绍了微信小程序页面间通信的5种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的。
如上图,这是一个常见结构的小程序:首页是一个双Tab框架PageA和PageB,子页面pageB, PageC。
让我们假设这样一个场景:首页PageA有一个飘数,当我们从PageA新开PageC后,做一些操作,再回退到PageA的时候,这个飘数要刷新。很显然,这需要在PageC中做操作时,能通知到PageA,以便PageA做相应的联动变化。
这里的通知,专业点说就是页面通信。所谓通信,u3认为要满足下面两个条件:
激活对方的一个方法调用
能够向被激活的方法传递数据
本文将根据项目实践,结合小程序自身特点,就小程序页面间通信方式作一个探讨与小结。
按页面层级(或展示路径)可以分为:
兄弟页面间通信。如多Tab页面间通信,PageA,PageB之间通信
父路径页面向子路径页面通信,如PageA向PageC通信
子路径页面向父路径页面通信,如PageC向PageA通信
按通信时激活对方方法时机,又可以分为:
延迟激活,即我在PageC做完操作,等返回到PageA再激活PageA的方法调用
立即激活,即我在PageC做完操作,在PageC激活PageA的方法调用
方式一:onShow/onHide + localStorage
利用onShow/onHide激活方法,通过localStorage传递数据。大概逻辑如下
let isInitSelfShow =
helloMsg: 'hello from PageA'
onShow() {
// 页面初始化也会触发onShow,这种情况可能不需要检查通信
if (isInitSelfShow)
let newHello = wx.getStorageSync('__data');
if (newHello) {
this.setData({
helloMsg: newHello
// 清队上次通信数据
wx.clearStorageSync('__data');
onHide() {
isInitSelfShow =
wx.navigateTo({
url: '/pages/c/c'
doSomething() {
wx.setStorageSync('__data', 'hello from PageC');
优点:实现简单,容易理解
缺点:如果完成通信后,没有即时清除通信数据,可能会出现问题。另外因为依赖localStorage,而localStorage可能出现读写失败,从面造成通信失败
注意点:页面初始化时也会触发onShow
方式二:onShow/onHide + 小程序globalData
同方式一一样,利用onShow/onHide激活方法,通过读写小程序globalData完成数据传递
let isInitSelfShow =
let app = getApp();
helloMsg: 'hello from PageA'
onShow() {
if (isInitSelfShow)
let newHello = app.$$data.helloM
if (newHello) {
this.setData({
helloMsg: newHello
// 清队上次通信数据
app.$$data.helloMsg =
onHide() {
isInitSelfShow =
wx.navigateTo({
url: '/pages/c/c'
let app = getApp();
doSomething() {
app.$$data.helloMsg = 'hello from pageC';
优点:实现简单,实现理解。因为不读写localStorage,直接操作内存,所以相比方式1,速度更快,更可靠
缺点:同方式1一样,要注意globalData污染
方式三:eventBus(或者叫PubSub)方式
这种方式要先实现一个PubSub,通过订阅发布实现通信。在发布事件时,激活对方方法,同时传入参数,执行事件的订阅方法
/* /plugins/pubsub.js
* 一个简单的PubSub
export default class PubSub {
constructor() {
this.PubSubCache = {
on(type, handler) {
let cache = this.PubSubCache[type] || (this.PubSubCache[type] = {});
handler.$uid = handler.$uid || this.PubSubCache.$uid++;
cache[handler.$uid] =
emit(type, ...param) {
let cache = this.PubSubCache[type],
if(!cache)
for(key in cache) {
tmp = cache[key];
cache[key].call(this, ...param);
off(type, handler) {
let counter = 0,
cache = this.PubSubCache[type];
if(handler == null) {
if(!cache)
return !!this.PubSubCache[type] && (delete this.PubSubCache[type]);
!!this.PubSubCache[type] && (delete this.PubSubCache[type][handler.$uid]);
for($type in cache) {
counter++;
return !counter && (delete this.PubSubCache[type]);
let app = getApp();
helloMsg: 'hello from PageA'
onLoad() {
app.pubSub.on('hello', (number) =& {
this.setData({
helloMsg: 'hello times:' + number
wx.navigateTo({
url: '/pages/c/c'
let app = getApp();
let counter = 0;
doSomething() {
app.pubSub.emit('hello', ++counter);
app.pubSub.off('hello');
缺点:要非常注意重复绑定的问题
方式四:gloabelData watcher方式
前面提到方式中,我们有利用globalData完成通信。现在数据绑定流行,结合redux单一store的思想,如果我们直接watch一个globalData,那么要通信,只需修改这个data值,通过water去激活调用。同时修改的data值,本身就可以做为参数数据。
为了方便演示,这里使用oba这个开源库做为对象监控库,有兴趣的话,可以自己实现一个。
import oba from '../../plugin/oba';
let app = getApp();
helloMsg: 'hello from PageA'
onLoad() {
oba(app.$$data, (prop, newvalue, oldValue) =& {
this.setData({
helloMsg: 'hello times: ' + [prop, newvalue, oldValue].join('#')
wx.navigateTo({
url: '/pages/c/c'
let app = getApp();
let counter = 0;
doSomething() {
app.$$data.helloTimes = ++
优点:数据驱动,单一数据源,便于调试
缺点:重复watch的问题还是存在,要想办法避免
方式五:通过hack方法直接调用通信页面的方法
直接缓存页面PageModel, 通信时,直接找到要通信页面的PageModel,进而可以访问通信页面PageModel所有的属性,方法。简直不能太cool,感谢小组内小伙伴发现这么amazing的方式。有人肯定会问了,怎么拿到这个所有的PageModel呢。其它很简单,每个页面有onLoad方法,我们在这个事件中,把this(即些页面PageModel)缓存即可,缓存时用页面路径作key,方便查找。那么页面路径怎么获取呢,答案就是page__route__这个属性
// plugin/pages.js
// 缓存pageModel,一个简要实现
export default class PM {
constructor() {
this.$$cache = {};
add(pageModel) {
let pagePath = this._getPageModelPath(pageModel);
this.$$cache[pagePath] = pageM
get(pagePath) {
return this.$$cache[pagePath];
delete(pageModel) {
delete this.$$cache[this._getPageModelPath(pageModel)];
} catch (e) {
_getPageModelPath(page) {
return page.__route__;
let app = getApp();
helloMsg: 'hello from PageA'
onLoad() {
app.pages.add(this);
wx.navigateTo({
url: '/pages/c/c'
sayHello(msg) {
this.setData({
helloMsg: msg
let app = getApp();
doSomething() {
// 见证奇迹的时刻
app.pages.get('pages/a/a').sayHello('hello u3xyz.com');
优点:一针见血,功能强大,可以向要通信页面做你想做的任何事。无需要绑定,订阅,所以也就不存在重复的情况
缺点:使用了__route__这个hack属性,可能会有一些风险
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 485通信程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信