Python网络编程中recv完整接收数据的三种实现策略

阿橙
阿橙
发布时间:2026-10-13| 3人浏览过
原创

本文深入探讨Python网络编程中利用recv函数完整接收数据的三种核心方法。首先介绍基于连接断开的接收策略,适用于短连接场景;其次解析通过协议尾标识定位完整报文的方法;最后详解基于负载长度字段进行边接收边解析的技术。文章提供具体代码实现,帮助开发者解决TCP通信中的数据完整性问题。

近期在开发一款通用的TCP客户端测试工具时,涉及Python网络编程。在基于Socket进行网络通信开发的过程中,如何准确判定对端发送的一条报文是否已接收完毕,是必须解决的关键问题。以下简要介绍判定数据接收完成的三种常用方法。

1. 基础数据接收法

采用基础数据接收法时,若与服务端Socket断开连接,程序将接收到空字符串。利用这一特性,可在程序中构建循环持续接收数据,直至数据发送端关闭Socket连接。该方法适用于客户端与服务器之间为短连接的场景(即一次Socket通讯后连接立即关闭)。具体代码如下:

import socket,struct,sys,time
Port=22220
#assume a socket disconnect (data returned is empty string) means all data was #done being sent.
def recv_basic(the_socket):
 total_data=[]
 while True:
  data = the_socket.recv(20480) 
  if not data: break
  total_data.append(data)
 return ''.join(total_data)

2. 尾标识方法

该方法通过查找接收到的协议数据中的尾标识字符串,从而获取完整的数据报文。其适用场景为接收的协议数据中明确包含相关的尾标识。具体代码如下:

End='something useable as an end marker'
def recv_end(the_socket):
 total_data=[];data=''
 while True:
   data=the_socket.recv(8192)
   if End in data:
    total_data.append(data[:data.find(End)])
    break
   total_data.append(data)
   if len(total_data)>1:
    #check if end_of_data was split
    last_pair=total_data[-2]+total_data[-1]
    if End in last_pair:
     total_data[-2]=last_pair[:last_pair.find(End)]
     total_data.pop()
     break
 return ''.join(total_data)

3. 负载长度方法

即通过协议数据中的负载长度值来确定有效报文的长度。该方法适用于协议数据中包含负载协议字段的场景。这是一种较为常用且通用的方法,但需要在接收数据的同时进行解析。具体代码如下:

def recv_size(the_socket):
 #data length is packed into 4 bytes
 total_len=0;total_data=[];size=sys.maxint
 size_data=sock_data='';recv_size=8192
 while total_len<size:
  sock_data=the_socket.recv(recv_size)
  if not total_data:
   if len(sock_data)>4:
    size_data+=sock_data
    size=struct.unpack('>i', size_data[:4])[0]
    recv_size=size
    if recv_size>524288:recv_size=524288
    total_data.append(size_data[4:])
   else:
    size_data+=sock_data
  else:
   total_data.append(sock_data)
  total_len=sum([len(i) for i in total_data ])
 return ''.join(total_data)

以上内容为本文的全部介绍,希望这些内容能对各位的学习或工作有所帮助,同时也欢迎大家继续支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。