biGpython

生亦何欢,死亦何苦? 予我長袖,我必善舞!

导航

长连接与短连接 同步与异步

这个东西看过好多遍了,总是混淆,在代码实现没有下功夫,总在看概念性的东西。

长连接与短连接

长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。
这种方式下由于通讯连接一直存在此种方式常用于P2P通信。
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接
此方式常用于一点对多点通讯。C/S通信。

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

长连接与短连接的操作过程

通常的短连接操作步骤是: 
连接→数据传输→关闭连接;


而长连接通常就是: 
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接; 
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了

短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接


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

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

 

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

 

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

************************************

Socket 长连接的实现,需要另启一个线程间隔时间地发送心跳数据报文(内容可以自定义,比如发送 TEST 服务端返回 TEST_OK),如果发送了 TEST,并在读取数据超时时间之内读到了由服务端返回的 TEST_OK 时,那就表示当前链路是健康的。

如果发送 TEST 报错,或者发送出去且超时时间已经到了还没有收到 TEST_OK 时,就进行重连处理,在此之前需要控制住所有往套接字中写的数据,让其阻塞在写入套接字之外。

短连接:  
run(){  
read //读取请求包  
process //处理  
write //应答处理结果  
}  

长连接 :  
run(){  
while(NotEnd){  
read  
process  
write  
}  
}  

  


(同步)(异步)   

举个例子:普通B/S模式(同步)AJAX技术(异步)   
           
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事   
           
异步:   请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕


以通讯为例   
           
同步:发送一个请求,等待返回,然后再发送下一个请求   
           
异步:发送一个请求,不等待返回,随时可以再发送下一个请求   
           
并发:同时发送多个请求

 最好的比方就是:同步是电话,异步是广播。


posted on 2011-11-17 11:16  biGpython  阅读(2026)  评论(0编辑  收藏  举报