资源描述:
《软件系统之间的接口方式》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、软件系统之间的接口方式• 概述 软件接口是实现一个系统跟另外系统进行信息交互的桥梁,在不同的系统之间,根据系统的关联程度的不同存在紧耦合和松耦合两种:紧耦合要求接口响应反应快,消息不能阻塞;松耦合对响应反应要求比较低。在目前应用中,Socket、消息队列(MessageQueue)、WebService等都有相应的应用,但是应用中发现各通讯方式有自己固有的特征,“适合的才是最好的”,这是真理。 在接口和系统信息交互的过程中,两种模式使用得很普遍:同步调用和异步调用,同步调用要求接口发出请求消息后必须等待服务端系统的应答消
2、息,接口阻塞直至超时;异步调用则发出请求消息后,接口可以从事其它处理,定时轮询服务端应答消息和消息或事件通知。同步方式简单,但是很容易造成接口阻塞,造成消息积压超时。• 技术实现 • Socket通讯 Socket通讯相对来说是很古老的通讯方式,也是最常用的通讯方式。Socket通讯有阻塞和非阻塞两种方式。在同步方式,采用阻塞编程比较简单,但是为了防止接口阻塞,我们需要设置Socket超时,因此可以使用Socket的SELECT模型(参考如下示例代码): ReceLen=0; CurReceLen=0; for(;
3、;) { iResult=select(0,&fdread,NULL,NULL,&timeout); if(iResult==0) { AfxMessageBox("接收应答消息超时!!!",MB_OK
4、MB_ICONERROR); closesocket(Socket); returnFALSE; } CurReceLen=recv(Socket,oBuf+ReceLen,len,NO_FLAG_SET); if((CurReceLen>0)&&(CurReceLen!=SOCKET_ERROR))
5、{ oBuf[ReceLen+CurReceLen]=' '; memcpy((char*)&MsgLen,oBuf,sizeof(WORD32)); MsgLen=ntohl(MsgLen); if(ReceLen+CurReceLen==MsgLen) { ReceLen+=CurReceLen; break; } ReceLen+=CurReceLen; } } 在异步方式下,采用非阻塞方式实现比较方便,在非阻塞方式下可使用WSAAsyncSelect模型和WSAEventSelect模型:W
6、SAAsyncSelect模型基于消息,WSAEventSelect模型基于事件,下面的示例代码设置了Socket进行读写和关闭操作的消息: status=WSAAsyncSelect(TempSocket,hWnd,WSA_READ,FD_READ
7、FD_CLOSE
8、FD_WRITE); if(status==SOCKET_ERROR) { WriteLogFile("Setstreamsocketmodulefail!!!IP(%s),Port(%d)and error(%d)",GetIPAddr((Peer
9、Map+node)->IPAddr),(PeerMap+node)->PeerPortNo,WSAGetLastError()); CloseSocket(TempSocket,__LINE__,__FILE__); returnFALSE; }无论使用阻塞方式或非阻塞方式编程,需要重点考虑的一个问题:粘包现象,即应用发送两个或以上的数据包,在Socket通讯层将数据包合并成一个发送出去,因此接收端收到数据包以后需要对数据包根据应用定义的长度进行拆分,否则导致应用层丢包。应用方式可以由用户封转成DLL供使用方使用.•
10、消息队列(MessageQueue)利用MSMQ(MicrosoftMessageQueue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。MSMQ与XMLWebServices和.NetRemoting一样,是一种分布式开发技术。但是在使用XMLWebServices或.NetRemoting组件时,Client端需要和Server端实时交换信息,Server需要保持联机。MSMQ则可以在Server离线的情况下工作,将M
11、essage临时保存在Client端的消息队列中,以后联机时再发送到Server端处理。显然,MSMQ不适合于Client需要Server端及时响应的这种情况,MSMQ以异步的方式和Server端交互,不用担心等待Server端的长时间处理过程。虽然XMLWebServices和.NetR