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

转自:http://blog.csdn.net/jxufewbt/article/details/1769312ios

 

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


一、共享 

在硬盘上创建一个文件,一个应用程序往该文件里写数据(能够不关闭文件,但必须刷新缓冲区),另外一个应用程序以共享方式打开这个文件并读取其中的内容,这即是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,一样能够简单地实现数据交换。但它的缺点也是显而易见的:只能采起轮询的方式得到最新数据(效率低下),网络映射的驱动器绝对不能变更或取消(可靠性差),因此这是一种“低级”的通信方式。  


二、DDE 

每一个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最先的基于Windows的数据交换方法,有三种方式可供选择:冷链接、温链接和热链接。通常都是由客户端向服务器端发出链接申请,而且必须指明服务器端的名字和标题。在链接创建后,数据能够双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,可以让其它应用程序来控制它。DDE是彻底向后兼容的,从16位平台转到32位,源代码几乎不用修改。  

DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个很是吸引人的小程序“Chat”,能使两台计算机经过网络实时交谈,这在当时几乎是一项创举。但是不多有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工做原理仍然是DDE,但它能使一台计算机向在同一个网络中的另外一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,并且Microsoft也再也不积极支持DDE,因此它的前景不被看好。  


三、WM_COPYDATA  

Windows消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另外一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么咱们为何不把数据放在消息中一块儿发送出去呢?这样,咱们只要调用SendMessage(),以对方窗体的句柄做为第一个参数,以含有指向实际数据的指针结构的地址做为第二个参数,就能够把整个数据块看成消息发向另外一个应用程序。也许有的程序员会说,一个自定义的消息一样能够完成这样的工做。他只说对了一半。自定义消息的确能够发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程当中才是合法的,若在其它模块中存取该内存区就会致使“Access Violation”。而使用WM_COPYDATA 则不存在这个问题,由于Windows 自己会替你处理这一切。深刻钻研下去,你会发现它实际上是先建立了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,而后再在接收方对这个映射文件打开一个“视图”。WM_COPYDATA 的不足之处在于:必需要有一个窗体来接收消息和数据(缺少灵活性),数据在使用以前先得拷贝到一个映射文件(浪费资源)。  


四、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的优势是速度较快,缺点是可靠性较差。  


五、标准的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是不二之选。  


六、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读写数据,代码如服务器

<br>pipe = CreateFile(pPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0,NULL); <br>success = WriteFile(pipe, pMessage, strlen(pMessage) + 1, &bytesWritten, NULL);  

Pipe分两种,即命名Pipe和匿名Pipe。匿名Pipe是以句柄而不是以名字来进行标识的,于是也就限制了它只能在同一台机器上通信,而不能应用于网络。命名Pipe则提供了以名字来进行标识,因此能在网络上的其它任何地方打开它。须要注意的是:命名Pipe只能在 Win NT而不是Win 95上建立(即Server网络

端),Client端则能够是任意平台。  <br><br>Pipe既能够单向通信也能够双向通信,Mailslot则只能单向通信。Client端能够发送消息给mailslot,但不能接收消息;若是你想要接收消息,则只能建立一个新的mailslot。但mailslot有一个很大的优势:它支持数据广播。也就是说,若Client端发送一条消息,函数

则整个网络中的同名对象都能收到。这是由于mailslot的名字的做用域只是在本台机器上,因此可在不一样机器上建立同名的mailslot,当Client端发来消息时则每一台机上的mailslot都获得了该消息的一份拷贝,并在本机上做出相应的反应。Mailslot的最大缺陷是不可靠,由于它的数据是以数据报格式来传送学习

的,网络错误或负荷太重都会致使数据丢失。  spa

相关文章
相关标签/搜索