`
isiqi
  • 浏览: 16590623 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

应用程序之间互相通讯的几种方法

阅读更多
应用程序之间互相通讯的几种方法
  沈炜

  应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。

  1、共享

<clk></clk>   在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key0" onmouseover="kwE(event,1, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC(event,1);" onmouseout="kwL(event, this);" target="_blank">Windows</nobr> 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消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我们为什么不把数据放在消息中一起发送出去呢?这样,我们只要调用SendMessage(),以对方窗体的句柄作为第一个参数,以含有指向实际数据的指针结构的地址作为第二个参数,就可以把整个数据块当作消息发向另一个应用程序。也许有的程序员会说,一个自定义的消息同样可以完成这样的工作。他只说对了一半。自定义消息的确可以发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程中才是合法的,若在其它模块中存取该内存区就会导致“Access Violation”。而使用WM_COPYDATA 则不存在这个问题,因为Windows 本身会替你处理这一切。深入钻研下去,你会发现它其实是先创建了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,然后再在接收方对这个映射文件打开一个“视图”。WM_COPYDATA 的不足之处在于:必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源)。

  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。

  以上介绍的只是现今流行的一些通讯方法,它们各有各的优缺点,没有哪一种是万能的。因此,只有在合适的场合采用合适的方案,才是最好的解决办法。

分享到:
评论

相关推荐

    S7-200 Modbus主站通讯程序.rar

    而Modbus通信协议作为工业设备间通信的一种标准,使得不同厂商的设备能够互相交换数据,大大提升了系统的兼容性和灵活性。本篇文章将详细解析“S7-200 Modbus主站通讯程序”的核心知识点,帮助读者理解如何实现S7-...

    NET多进程间进行互相通讯

    `System.IO.MemoryMappedFiles`是.NET Framework 4.0引入的一个新特性,它允许应用程序将文件或一部分文件映射到进程的地址空间中,从而可以在内存中直接操作文件内容,而无需反复读写磁盘。这一特性不仅提高了数据...

    Modbus-TCP/RTU通讯程序源码

    C#是Microsoft开发的一种面向对象的编程语言,适合构建跨平台的.NET应用程序。在C#中实现Modbus通信,开发者需要理解以下几个关键点: 1. **Modbus帧结构**:不论是TCP还是RTU,Modbus通信的基本单元是报文,包含...

    守护进程(互相监听)

    描述中提到的"没有采用网上流传的哪几种指标不治本的方法",可能是指一些常见的临时性或表面性的解决方案,比如仅仅通过定期重启服务来避免问题,或者只处理已知故障而不预防未知问题。开发者采用了更深入的解决方案...

    电信设备-一种实现android移动设备与USB+OTG主机通讯的方法.zip

    标题中的“电信设备-一种实现android移动设备与USB+OTG主机通讯的方法”是指在Android移动设备上通过USB On-The-Go(OTG)技术与USB主机进行通信的技术方案。USB OTG允许设备在没有主机的情况下互相连接和交换数据,...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

    实现动态IP间程序的相互通信(P2P)

    源码中提到的“不采用任何第三方控件D6”表明,这个项目可能使用了Delphi 6(D6)作为开发环境,这是一种面向对象的可视化编程工具,支持创建Windows应用程序。Delphi自带的VCL(Visual Component Library)库提供了...

    sharemem23.rar_NativeXml.pas_delphi ShareM_shareMem DELP

    在 Delphi 中实现进程间通信,开发者通常会使用以下几种方法: 1. **管道(Pipes)**:提供双向通信,适合大量数据传输。 2. **套接字(Sockets)**:适用于网络环境,也可用于本地进程间通信。 3. **共享内存...

    互助链程序

    【互助链程序】是一种在互联网上广泛使用的软件应用,它主要设计用于社区或者网络平台,以促进用户之间的互相帮助和资源共享。在这个系统中,用户可以发布求助信息,其他用户则根据自身的能力和资源来提供帮助,形成...

    三菱的FX1S与三菱的FR-E540变频器通过485接口的通讯程序.rar

    Modbus是一种广泛使用的工业通信协议,它定义了数据的结构和命令集,使得不同厂商的设备可以互相通信。 5. **编程实践**:在"变频器与PLC的通讯(FX1S三菱)已测试成功"这个文件中,很可能包含了实现上述通信的详细...

    多线程编程之三——线程间通讯

    下面将详细讨论几种常见的线程间通信方式。 1. 使用全局变量进行通信 全局变量是所有线程都能访问的内存区域,因此可以用来传递简单的数据。为了确保多线程环境下的正确性,通常会使用`volatile`关键字修饰全局变量...

    VB基础教程完整版

    它是一种封装技术,提供封装 COM 组件并将其置入应用程序(如 WEB 浏览器)的一种方法。 7. Components Object Model(COM):是软件组件互相通讯的一种方式。 VB 的系统特性: 1. 工程限制:  (1)代码限制:可...

    modbus 通讯功能吗

    以下是几种常见的功能码及其说明: 1. **01 读保持线圈状态(Read Coil Status)** - **用途**:读取一系列连续的保持线圈的状态。 - **格式**:请求报文包括起始地址和线圈数量;响应报文返回线圈的状态。 2. *...

    发射端控制程序_超声定位发射端控制程序_源码

    控制程序需要管理发射脉冲的间隔,确保每个超声波传感器之间不会互相干扰,并且正确地记录发送时间。 4. 通讯协议:STM32可能需要与其他部件(如接收端或主控设备)通信,以传递控制指令或接收反馈数据。这可能涉及...

    C#与PLC通讯读写源码.zip

    PLC通信通常涉及到以下几种协议: 1. **Modbus**:一种开放的串行通信协议,被广泛采用,允许PLC与其他设备交换数据。 2. **OPC (OLE for Process Control)**:基于微软COM/DCOM技术,提供了一个标准接口,使得不同...

    e语言-DDE动态数据交换

    DDE = Dynamic Data Exchange,是 16 位 Windows 时代实现不同应用程序之间互相交换数据和控制的技术,现在用得很少了,Windows Shell 外壳打开某些文件类型还用到 DDE。  OLE = Object Linking and ...

    西门子PLC例程-CP342-5与CP342-5之间的PROFIBUS通讯例程.zip

    在本例程中,我们关注的是CP342-5模块如何通过PROFIBUS协议进行通讯,这是工业现场总线系统的一种,广泛应用于制造业自动化。 首先,我们需要了解PROFIBUS。PROFIBUS(Process Field Bus,过程现场总线)是一种国际...

    vb写的qq程序,直接登录qq

    标题中的“vb写的qq程序,直接登录qq”指的是使用Visual Basic(VB)编程语言开发的一个应用程序,该程序能够实现用户直接通过它登录QQ账号,进行即时通讯。在VB中,可以利用API调用来与QQ的服务器进行通信,实现...

    PC上位机与51单片机双向通讯智能温控(含上位机和下位机)

    双向通讯是指上位机(通常是个人电脑)和下位机(51单片机)之间可以互相发送和接收数据。在本系统中,这可能是通过串行通信(如RS-232或USB转串口)实现的。上位机软件可能使用C#、Java或Python等语言编写,通过...

Global site tag (gtag.js) - Google Analytics