软件接口中底层通讯的几种方式Socket简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件接⼝中底层通讯的⼏种⽅式Socket简介
软件接⼝是实现⼀个系统跟另外系统进⾏信息交互的桥梁,在不同的系统之间,根据系统的关联程度的不同存在紧耦合和松耦合两种:紧耦合要求接⼝响应反应快,消息不能阻塞;松耦合对响应反应要求⽐较低。
本⼈主要讨论紧耦合接⼝通讯实现,在⽬前应⽤中, Socket 、中间件、 P 等都⽤相应的应⽤,但是应⽤中发现各通讯⽅式有⾃⼰固有的特征,“适合的才是最好的”,这是真理。
在接⼝和系统信息交互的过程中,两种模式使⽤得很普遍:同步调⽤和异步调⽤,同步调⽤要求接⼝发出请求消息后必须等待服务端系统的应答消息,接⼝阻塞直⾄超时;异步调⽤则发出请求消息后,接⼝可以从事其它处理,定时轮询服务端应答消息和消息或事件通知。
同步⽅式简单,但是很容易造成接⼝阻塞,造成消息积压超时。
• 技术实现
• Socket 通讯
Socket 通讯相对来说是很古⽼的通讯⽅式,也是最常⽤的通讯⽅式。
Socket 通讯有阻塞和⾮阻塞两种⽅式。
在同步⽅式,采⽤阻塞编程⽐较简单,但是为了防⽌接⼝阻塞,我们需要设置 Socket 超时,因此可以使⽤ Socket 的 SELECT 模型(参考如下⽰例代码):
在异步⽅式下,采⽤⾮阻塞⽅式实现⽐较⽅便,在⾮阻塞⽅式下可使⽤WSAAsyncSelect模型和 WSAEventSelect 模型: WSAAsyncSelect模型基于消息,WSAEventSelect 模型基于事件,下⾯的⽰例代码设置了 Socket 进⾏读写和关闭操作的消息:
⽆论使⽤阻塞⽅式或⾮阻塞⽅式编程,需要重点考虑的⼀个问题:粘包现象,即应⽤发送两个或以上的数据包,在 Socket 通讯层将数据包合并成⼀个发送出去,因此接收端收到数据包以后需要对数据包根据应⽤定义的长度进⾏拆分,否则导致应⽤层丢包。
• 中间件通讯
⽬前中间也⽐较多,我所使⽤的中间件有 BEA 的 Tuxedo 和东⽅通的 TongEasy , TongEasy 我就不说了,主要讨论⼀下 Tuxedo 。
BEA Tuxedo 系统提供九种通信模式:
• 同步 Request/Response 模式;
• 异步 Request/Response 模式;
• 嵌套调⽤;
• 调⽤转发;
• 会话通信;
• 主动消息通告;
• 基于事件的通信;
• 基于队列的通信;
• 使⽤事务。
同步请求 / 应答⽅式⽐较简单,因此在应⽤中也使⽤得相当多。
但是同步请求 / 应答⽅式在服务端服务端反应⽐较慢时造成阻塞,如果使⽤了多线程⽅式,不管 Tuxedo 采⽤长连接还是短连接均容易造成线程挂起,不能再进⾏后续处理,很多情况需要程序重启。
采⽤异步⽅式不会造成阻塞,但需要去查询是否有应答消息,下⾯的代码实现了使⽤异步函数实现同步调⽤的功能,增加了超时处理,这样不会导致程序阻塞:
如果要增加接⼝的处理能⼒,使⽤多线程⽅式会存在隐患,最好的⽅式是采⽤多进程,不过存在如何消息均衡的问题。
• SOAP 通讯
SOAP 作为⼀种协议,同服务端 Service 进⾏通讯。
和提供了 SOAP 协议的 SDK ,我使⽤的是微软的 SOAP Toolkit3.0 ,这是基于 COM 的⼀套组件,因此具有 COM 的特征,在调⽤参数的处理, windows 和 unix 顺序恰好相反,下⾯的代码实现了调⽤⼀个 Web Service :
• 总结
在三种通讯⽅式中,各有优缺点,但是主要还在于服务端采⽤什么技术⽅案来实现,接⼝必须对应采⽤相应的通讯模式。
除了上⾯的通讯模式,当然还有很多其它的⽅式,如管道、消息队列等,⽬前我在紧耦合的接⼝中使⽤得不多。
-----------------------------------------------------------------------
socket的英⽂原义是“孔”或“插座”。
作为4BDS UNIX的进程通信机制,取后⼀种意思。
通常也称作"套接字",⽤于描述IP地址和端⼝,是⼀个通信链的句柄。
展开
⼀ socket协议
Socket协议的形象描述
socket⾮常类似于电话插座。
以⼀个国家级电话⽹为例。
电话的通话双⽅相当于相互通信的2
个进程,区号是它的⽹络地址;区内⼀个单位的相当于⼀台主机,主机分配给每个⽤户的局内号码
相当于socket号。
任何⽤户在通话之前,⾸先要占有⼀部电话机,相当于申请⼀个socket;同时要
知道对⽅的号码,相当于对⽅有⼀个固定的socket。
然后向对⽅拨号呼叫,相当于发出连接请求
(假如对⽅不在同⼀区内,还要拨对⽅区号,相当于给出⽹络地址)。
对⽅假如在场并空闲(相当于通
信的另⼀主机开机且可以接受连接请求),拿起电话话筒,双⽅就可以正式通话,相当于连接成
功。
双⽅通话的过程,是⼀⽅向电话机发出信号和对⽅从电话机接收信号的过程,相当于向socket
发送数据和从socket接收数据。
通话结束后,⼀⽅挂起电话机相当于关闭socket,撤消连接。
电话系统
在电话系统中,⼀般⽤户只能感受到本地电话机和对⽅电话号码的存在,建⽴通话的过程,话
⾳传输的过程以及整个电话系统的技术细节对他都是不透明的,这也与socket机制⾮常相似。
socket利⽤⽹间⽹通信设施实现进程通信,但它对通信设施的细节毫不关⼼,只要通信设施能提供
⾜够的通信能⼒,它就满⾜了。
⾄此,我们对socket进⾏了直观的描述。
抽象出来,socket实质上提供了进程通信的端点。
进
程通信之前,双⽅⾸先必须各⾃创建⼀个端点,否则是没有办法建⽴联系并相互通信的。
正如打电
话之前,双⽅必须各⾃拥有⼀台电话机⼀样。
在⽹间⽹内部,每⼀个socket⽤⼀个半相关描述:
(协议,本地地址,本地端⼝)
⼀个完整的socket有⼀个本地唯⼀的socket号,由操作系统分配。
最重要的是,socket 是⾯向客户/服务器模型⽽设计的,针对客户和服务器程序提供不同的
socket 。
客户随机申请⼀个socket (相当于⼀个想打电话的⼈可以在任何⼀台⼊⽹电话上拨号呼
叫),系统为之分配⼀个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接
请求和信息请求(相当于⼀个被呼叫的电话拥有⼀个呼叫⽅知道的电话号码)。
socket利⽤客户/服务器模式巧妙地解决了进程之间建⽴通信连接的问题。
服务器socket 半相
关为全局所公认⾮常重要。
读者不妨考虑⼀下,两个完全随机的⽤户进程之间如何建⽴通信?假如
通信双⽅没有任何⼀⽅的socket 固定,就好⽐打电话的双⽅彼此不知道对⽅的电话号码,要通话是
不可能的。
-----
Socket 接⼝
Socket 接⼝是访问 Internet 使⽤的最⼴泛的⽅法。
如果你有⼀台刚配好TCP/IP协议的主机,
其IP地址是202.120.127.201,此时在另⼀台主机或同⼀台主机上执⾏ftp 202.120.127.201,显然
⽆法建⽴连接。
因"202.120.127.201" 这台主机没有运⾏FTP服务软件。
同样,在另⼀台或同⼀台
主机上运⾏浏览软件如Netscape,输⼊"http://202.120.127.201",也⽆法建⽴连接。
现在,如果在
这台主机上运⾏⼀个FTP服务软件(该软件将打开⼀个Socket,并将其绑定到21端⼝),再在这
台主机上运⾏⼀个Web 服务软件(该软件将打开另⼀个Socket,并将其绑定到80端⼝)。
这样,
在另⼀台主机或同⼀台主机上执⾏ftp 202.120.127.201,FTP客户软件将通过21端⼝来呼叫主机上
由FTP 服务软件提供的Socket,与其建⽴连接并对话。
⽽在netscape中输
⼊"http://202.120.127.201"时,将通过80端⼝来呼叫主机上由Web服务软件提供的Socket,与其建
⽴连接并对话。
socket原理
在Internet上有很多这样的主机,这些主机⼀般运⾏了多个服务软件,同时提供⼏种服务。
每
种服务都打开⼀个Socket,并绑定到⼀个端⼝上,不同的端⼝对应于不同的服务。
Socket正如其英
⽂原意那样,象⼀个多孔插座。
⼀台主机犹如布满各种插座的房间,每个插座有⼀个编号,有的插
座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节⽬。
客户软件将插头插到不同编号的插座,就可以得到不同的服务。