recv() 方法
recv()
方法是TCP套接字中最常用的接收数据方法。它用于从已连接的套接字接收数据。
特点:
- 阻塞调用:如果没有数据可读,
recv()
会阻塞调用线程,直到有数据可读或连接关闭。 - 按字节流接收:TCP套接字将数据看作字节流,没有明确的消息边界。因此,
recv()
接收的是字节流的一部分,需要开发者自行处理消息的分割和重组。
应用场景:
- 适用于需要可靠、有序、无重复的数据传输的应用,如文件传输、Web服务器等。
while True:
data = connection.recv(1024) # 接收最多1024字节的数据
if not data:
break # 连接关闭或没有数据可读
# 处理接收到的数据
recvfrom() 方法
recvfrom()
方法通常用于UDP套接字,用于接收来自任意客户端的数据。
特点:
- 阻塞调用:与
recv()
类似,如果没有数据可读,recvfrom()
会阻塞调用线程。 - 接收数据报:UDP是基于数据报的协议,每个
recvfrom()
调用接收一个完整的数据报,包括数据和发送方的地址。
应用场景:
- 适用于不需要建立稳定连接的应用,如实时聊天、广播等。
- 适用于需要快速响应的应用,因为UDP不保证数据的可靠性,所以可以减少网络延迟。
while True:
data, addr = sock.recvfrom(1024) # 接收数据报和发送方地址
# 处理接收到的数据和地址
recv_into() 方法
recv_into()
方法类似于recv()
,但它接收数据并直接存储在一个预分配的字节数组中,而不是返回一个新的字节对象。
特点:
- 避免额外的内存分配和复制操作,可以提高性能。
- 需要提供一个字节数组作为缓冲区。
应用场景:
- 当需要高效处理大量数据时,
recv_into()
可以减少内存分配和复制的开销。
buffer = bytearray(1024)
while True:
nbytes = connection.recv_into(buffer) # 接收数据到缓冲区
if nbytes == 0:
break # 连接关闭或没有数据可读
# 处理接收到的数据(从缓冲区读取)
readline() 和 readlines() 方法
对于文本模式的套接字(即使用socket.SOCK_STREAM
并设置socket.setblocking(False)
为非阻塞模式),可以使用readline()
和readlines()
方法从套接字读取文本行。
特点:
readline()
读取直到遇到换行符(\n
)为止的数据。readlines()
读取所有可用的行,返回一个行的列表。
应用场景:
- 当需要从套接字读取按行分隔的文本数据时,如从远程服务器读取日志文件。
while True:
line = connection.readline() # 读取一行数据
if not line:
break # 连接关闭或没有数据可读
# 处理接收到的行数据