长连接 短连接 异步 同步 )阻塞与非阻塞详解


一。通信方式 
主要有以下三大类: 
(一)SERVER/CLIENT方式 
1.一个Client方连接一个Server方,或称点对点(peer to peer): 
2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 
3.一个Client方连接多个Server方,这种方式很少见,主要 
用于一个客户向多个服务器发送请求情况。 

(二)连接方式 
1.长连接 
Client方与Server方先建立通讯连接,连接建立后不断开, 
然后再进行报文发送和接收。这种方式下由于通讯连接一直 
存在,可以用下面命令查看连接是否建立: 
netstat –f inet|grep 端口号(如5678)。 
此种方式常用于点对点通讯。 

2.短连接 
Client方与Server每进行一次报文收发交易时才进行通讯连 
接,交易完毕后立即断开连接。此种方式常用于一点对多点 
通讯,比如多个Client连接一个Server. 

(三)发送接收方式 
1.异步 
报文发送和接收是分开的,相互独立的,互不影响。这种方 
式又分两种情况: 
(1)异步双工:接收和发送在同一个程序中,有两个不同的 
子进程分别负责发送和接收 
(2)异步单工:接收和发送是用两个不同的程序来完成。 
2.同步 
报文发送和接收是同步进行,既报文发送后等待接收返回报文。 
同步方式一般需要考虑超时问题,即报文发上去后不能无限等 
待,需要设定超时时间,超过该时间发送方不再等待读返回报 
文,直接通知超时返回。 

实际通信方式是这三类通信方式的组合。比如一般书上提供的 
TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的 
组合是基本不用的,比较常用的有价值的组合是以下几种: 

同步短连接Server/Client 
同步长连接Server/Client 
异步短连接Server/Client 
异步长连接双工Server/Client 
异步长连接单工Server/Client 

其中异步长连接双工是最为复杂的一种通信方式,有时候经 
常会出现在不同银行或不同城市之间的两套系统之间的通信。 
比如金卡工程。由于这几种通信方式比较固定,所以可以预 
先编制这几种通信方式的模板程序。 

二.报文格式 
通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 
收和发送报文函数。 

(一)阻塞与非阻塞方式  
1.非阻塞方式 
读函数不停地进行读动作,如果没有报文接收到,等待一段时间后 
超时返回,这种情况一般需要指定超时时间。 
2.阻塞方式 
如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。 

(二)循环读写方式 
1.一次直接读写报文 
在一次接收或发送报文动作中一次性不加分别地全部读取或全部 
发送报文字节。 
2.不指定长度循环读写 
这一般发生在短连接进程中,受网络路由等限制,一次较长的报 
文可能在网络传输过程中被分解成了好几个包。一次读取可能不 
能全部读完一次报文,这就需要循环读报文,直到读完为止。 

3.带长度报文头循环读写 
这种情况一般是在长连接进程中,由于在长连接中没有条件能够 
判断循环读写什么时候结束,所以必须要加长度报文头。读函数 
先是读取报文头的长度,再根据这个长度去读报文.实际情况中, 
报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须 
转换成ASCII,常见的报文头码制有: 
(1)n个字节的ASCII码 
(2)n个字节的BCD码 
(3)n个字节的网络整型码 

以上是几种比较典型的读写报文方式,可以与通信方式模板一起 
预先提供一些典型的API读写函数。当然在实际问题中,可能还 
必须编写与对方报文格式配套的读写API. 

 

什么是长连接?

其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

通常的短连接操作步骤是:

连接-》数据传输-》关闭连接;

而长连接通常就是:

连接-》数据传输-》保持连接-》数据传输-》保持连接-…………-》关闭连接;



这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了



什么时候用长连接,短连接?



长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。



但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。



总之,长连接和短连接的选择要视情况而定。



一般在java上代码实现是



短连接: 

run(){ 

read //读取请求包 

process //处理 

write //应答处理结果 

长连接: 

run(){ 

while(NotEnd){ 

read 

process 

write 

}



以下是关于长连接中的检测保持连接的心跳比喻



连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:

长连接:系统通讯连接建立后就一直保持。

短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;

通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。

具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也就相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.



所以长短连接只是一个概念问题长短连接的socket,就是使用普通的socket函数,没有什么特殊的。



最后,关于同步与异步



同步操作指上一个操作返回结果后才能发下一个操作的数据包

异步操作指先把所有的操作数据包发完后再等待它们的返回结果

相比较看异步操作速度快特别是在每个包处理方法独立的情况下



异步操作一般提供两个端口,一个负责接收数据,一个负责发送数据

<<<<<<<<<<<<<<==========================================>>>>>>>>>>>>>>>>

长短的区别是我要搞清楚,见现在看而言,长连接占用资源,但是一般通信性能肯定是好,短省资源。另外一个很重要的区别就是,主动与被动,长连接是先主动建立一个连接,有数据就发送,没有就等,短连接则是如果有通信要求,被动的先建立一个连接,收发数据,断开。具体的好坏个人觉得还是需要编程实践才知道。应该说对与serverclient的影响还是很大。

 


上一篇:怎样理解Linux系统负荷


下一篇:linux下PHP错误警报开启与关闭