什么是“长连接”和“短连接”?

什么是“长连接”和“短连接”?

作者:admin |  时间:2014-02-18 |  浏览:537 |  0 条评论
解释1
所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,   
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接
 
解释2
长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。   
而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。
 
解释3
长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。   
通信方式   
  各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。   
  现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。
 
解释4
短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。   
长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。

贴个经典的,看完了就应该没啥问题了 : 

TCP/IP通信程序设计的丰富多样性 

刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 
序,据此一些人可能会认为TCP/IP编程很简单。其实不然, 
TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 
通信方式和报文格式的多样性上。 

一。通信方式 
主要有以下三大类: 
(一)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. 

在实际情况中,往往需要把我们自己的系统与别人的系统进行连接, 
有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。

关于长连接和短连接的讨论:
A 14:59:37  

B 14:59:49  
pu爷啥事
A 15:00:00  
什么是长连接,什么是短链接?
B 15:00:26  
http的吗?
B 15:00:31  
网络连接?
A 15:00:34  
当时,做你画我猜的时候,长连接是怎么弄得?
B 15:00:52  
我的方式有点山寨
B 15:01:07  
通过socket连接
B 15:01:11  
不断开
B 15:01:23  
http请求是每次都要建立连接的
B 15:01:54  
如果网络不好,可能会有问题,
B 15:02:30  
还有一种折中的实现方式,发心跳包,socket连接,如果中断了,再次连接
A 15:03:08  
flash在打开的时候,就建立一个socket,socket建立后,当成一个全局变量先放着,需要通信的时候,判断一下这个socket是不是还有效,如果没有效,就重连一下。
A 15:03:22  
是这样吗?
B 15:04:41  
嗯,是的,这种方式,服务端可能无法感知连接断开
B 15:04:55  
再加上一个心跳包会更好一些
A 15:05:42  
你说的折中方式,是不是就是客户端打开的时候,建立一个socket,看看成不成功,然后关闭。后台程序每隔一段时间,发心跳包,看成不成功。当需要的时候,再建立一个socket进行通信。
B 15:06:53  
不是需要的时候才连接
A 15:07:06  
就用心跳的那个,是吧
B 15:07:08  
其实长连接是为了方便服务端向客户端推送数据
A 15:07:45  
对,我们这边最近就要用都长连接。服务端准备用node.js
B 15:07:48  
所以,这个链接一定要维持着,一般会有个最长时间,比如一个小时,一小时后及时没有断开,也会主动断开,重连一次
A 15:08:31  
哦,明白刚哥的意思了
B 15:08:41  
应用开发部这边有一套长连接的服务,已经非常稳定了,比我的那个好多了
A 15:08:50  
是不是就是go
B 15:08:58  
你可以评估一下
A 15:09:07  
是不是go语言写的那个
B 15:10:46  
不是go的,是erlang写的
B 15:11:00  
go语言的是zhushou那边的吧
B 15:11:15  
如果感兴趣可以过来了解一下
A 15:11:36  
靠,不是吧,公司的太多了。go语言的那个,weishi那边好像也在用。erlang这个以前没有听说过
B 15:11:48  
我们云盘在用这个
A 15:12:02  
为什么要用erlang呢?
B 15:12:34  
这块不太清楚,不是我们组开发的,是应用开发部的平台组弄的
A 15:16:41  
你说的发心跳包。socket连接建立后,客户端向服务端发心跳包,还是服务端向客户端发心跳包,或者是互相发?
B 15:18:41  
客户端像服务端发
B 15:19:14  
如果用代理的话,客户端断开连接,代理服务器跟server没有断开,server可能无法感知到
A 15:21:52  
哦,明白。服务端收到心跳包,就可以确定客户端没有断开。既然这样挺好,为什么还要设置一个最大连接时间?
A 15:22:08  
到了最大连接时间,主动断开
B 15:27:19  
一个连接太久了,好像有问题
A 15:27:48  
嗯,好的,多谢刚哥。最近好好研究一下nodejs和长连接
B 15:27:49  
忘了什么问题了
B 15:28:00  
什么业务用?
A 15:28:10  
liulanqi用
B 15:28:22  
有什么心得分享一下哈
A 15:28:27  
嗯好的

本文标签:

相关推荐

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>