Socket 长连接、短连接

本文详细解释了长连接和短连接的概念,包括它们的工作原理、应用场景及优缺点。长连接适用于频繁操作的情况,能提高处理速度,如数据库连接;而短连接适合并发量大但用户操作不频繁的场景,例如WEB网站。

长连接与短连接

所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。  
比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。 
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

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

 

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


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

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

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

 

 

 

 

发送接收方式

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

 

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

 

 

单工、半双工和全双工

根据通信双方的分工和信号传输方向可将通信分为三种方式:单工、半双工与全双工。在计算机网络中主要采用双工方式,其中:局域网采用半双工方式,城域网和广域网采用全双年方式。   1. 单工(Simplex)方式:通信双方设备中发送器与接收器分工明确,只能在由发送器向接收器的单一固定方向上传送数据。采用单工通信的典型发送设备如早期计算机的读卡器,典型的接收设备如打印机。   2. 半双工(Half Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。例如,步话机是半双工设备,因为在一个时刻只能有一方说话。   3. 全双工(Full Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。例如,电话是全双工设备,因为双方可同时说话。


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

### Socket长连接短连接的区别 在网络通信领域,Socket 是一种允许不同设备之间通过网络交换数据的技术。根据会话持续时间和资源管理方式的不同,可以将 Socket 连接分为长连接短连接。 #### 长连接的特点 长连接是指一旦建立之后,在一定时间内不会轻易断开的连接形式。这种类型的连接通常用于频繁交互的数据传输场景中[^1]。具体来说: - **保持持久性**:即使当前没有实际的数据需要传送,双方仍然维持着这条链路的存在; - **减少握手次数**:由于不需要每次请求前重新发起三次握手过程,因此能够有效降低延迟并提高效率; - **适合高频率的小量数据传递**:对于那些需要不断发送少量信息的应用程序而言非常理想; ```python import socket def create_long_connection(host, port): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((host, port)) while True: message = "Heartbeat" client_socket.sendall(message.encode()) response = client_socket.recv(1024).decode() print(f"Received {response}") time.sleep(interval) create_long_connection('example.com', 8080) ``` #### 短连接的特点 相比之下,短连接则是在完成一次特定的任务后立即终止掉该条通路的方式。这种方式适用于一次性事务处理较多的情况[^2]。其主要特征如下: - **按需创建销毁**:每当有新的业务需求时才去构建一个新的 TCP 或者 UDP 的 session,并且在操作结束后马上释放相关资源; - **简化状态维护**:因为不存在长时间占用端口的现象,所以服务器端更容易管理和分配可用接口给其他用户访问; - **适用于大批量独立事件触发型应用**:比如网页浏览、文件下载等场合下表现良好; ```python import http.client conn = http.client.HTTPSConnection("www.example.com") conn.request("GET", "/path/to/resource") r1 = conn.getresponse() print(r1.status, r1.reason) data1 = r1.read() conn.close() ``` ### 应用场景分析 当涉及到具体的使用环境选择上,可以根据以下几个方面来进行考量: - 如果应用程序涉及大量的实时消息推送或者是在线聊天室等功能,则更适合采用长连接模式来保障用户体验流畅度的同时也降低了系统的整体负载压力[^3]。 - 对于一些只需要偶尔获取某些静态页面内容或是执行简单的查询指令的服务来说,利用短连接就足以满足性能上的要求而且还能更好地保护网络安全性和稳定性[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值