当前位置: 首页 > article >正文

python recv的概念和使用案例

recv 是网络编程中用于从套接字接收数据的核心函数,常见于 TCP/UDP 通信。以下是其概念、用法和案例详解:


概念

  1. 作用:从已连接(TCP)或已绑定(UDP)的套接字接收数据。
  2. 参数
    • bufsize: 指定接收缓冲区的大小(一次最多接收的字节数)。
    • flags(可选): 控制接收行为(如 MSG_PEEK 仅查看数据不移除)。
  3. 返回值
    • 成功时返回接收到的字节数据(类型为 bytes)。
    • 返回空字节(如 b'')表示连接已关闭(TCP)。
    • 错误时抛出异常(如超时、连接重置)。

使用场景

  • TCP 通信:需先建立连接(connect()/accept()),数据可靠但需处理粘包。
  • UDP 通信:无连接,需用 recvfrom 获取发送方地址,数据可能丢失或乱序。

使用案例(Python)

案例 1:TCP 客户端接收数据
import socket

# 创建 TCP 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8080))

# 发送请求
client.send(b"Hello Server!")

# 接收响应(最多 1024 字节)
data = client.recv(1024)
print(f"Received: {data.decode()}")

client.close()
案例 2:TCP 服务器循环接收数据
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 8080))
server.listen(1)

while True:
    client, addr = server.accept()
    print(f"Connected by {addr}")
    
    while True:
        data = client.recv(1024)  # 阻塞等待数据
        if not data:
            break  # 连接关闭
        print(f"Received: {data.decode()}")
        client.send(b"ACK")  # 回复确认
        
    client.close()
案例 3:UDP 接收数据(recvfrom
import socket

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(("0.0.0.0", 8080))

while True:
    data, addr = udp_socket.recvfrom(1024)  # 同时获取数据和地址
    print(f"Received from {addr}: {data.decode()}")
    udp_socket.sendto(b"Reply", addr)  # 向原地址回复

关键注意事项

  1. 阻塞与非阻塞模式

    • 默认阻塞:recv 会一直等待数据,直到有数据或连接关闭。
    • 非阻塞模式:设置 socket.setblocking(False),无数据时立即抛出 BlockingIOError
  2. 处理数据不完整

    • 需循环接收,直到满足业务逻辑(如接收固定长度或特定结束符):
      buffer = bytearray()
      while len(buffer) < expected_size:
          data = sock.recv(1024)
          if not data:
              break
          buffer.extend(data)
      
  3. 超时设置

    sock.settimeout(5.0)  # 5 秒后超时,抛出 socket.timeout
    try:
        data = sock.recv(1024)
    except socket.timeout:
        print("Timeout!")
    
  4. 判断连接关闭(TCP):

    • recv 返回空数据(b'')时,表示对方已关闭连接。

常见问题

  • 粘包问题:TCP 是流式协议,多次 send 可能被合并接收,需自定义协议(如添加长度头)。
  • 资源释放recv 失败后需关闭套接字,避免资源泄漏。
  • 编码处理:接收的 bytes 需解码(如 decode('utf-8')),注意处理异常(如非法字符)。

掌握 recv 的细节能显著提升网络应用的健壮性和性能!


http://www.kler.cn/a/533055.html

相关文章:

  • 【BUUCTF杂项题】荷兰宽带数据泄露、九连环
  • 人类心智逆向工程:AGI的认知科学基础
  • git进阶--6---git stash
  • 【教程】禁止网页右键和打开调试页面
  • 实现基础的shell程序
  • 【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)
  • 2025职业发展规划
  • Webots仿真添加行人的走路模型,并且添加自定义ROS接口。
  • ES6-代码编程风格(数组、函数)
  • 2. K8S集群架构及主机准备
  • 物理群晖SA6400核显直通win10虚拟机(VMM)
  • Swift 进阶:Observation 框架中可观察(@Observable)对象的高级操作(上)
  • 路由器考研讲解
  • 34.Word:公积金管理中心文员小谢【35】
  • 九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2)
  • 4.增强输入与玩家视角
  • 2.攻防世界PHP2及知识点
  • Nginx的配置文件 conf/nginx.conf /etc/nginx/nginx.conf 笔记250203
  • Vue3 完整学习笔记 - 第四部分
  • TCP 丢包恢复策略:代价权衡与优化迷局
  • LeetCode:583.两个字符串的删除操作
  • [leetcode·回溯算法]回溯算法解题套路框架
  • Kubernetes学习之网络
  • Github 2025-02-04 Python开源项目日报 Top10
  • Rust语言的并发编程
  • 青少年编程与数学 02-008 Pyhon语言编程基础 18课题、标准模块