You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket编程:客户端与服务端int数据收发及连接重置问题

Python Socket 客户端服务端通信问题排查与修复

需求说明

在客户端获取用户输入,将数据发送至服务端,服务端返回该数据,客户端接收后转换为int类型。

原服务端代码

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8890))

s.listen(5)
while True:
    s.listen()
    conn, addr = s.accept()
    print(f"Connection established from address {addr}")
    choice = s.recv(2048)
    conn.send(str(choice).encode('utf8'))
    conn.close()

原客户端代码

import socket

choice = input("Select: ")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 8890))

s.send(str(choice).encode('utf8'))

msg = s.recv(2048)
strings = msg.decode('utf8')
num = int(strings)

运行错误信息

Traceback (most recent call last):
  File "/Users/user/PycharmProjects/test/client.py", line 12, in <module>
    msg = s.recv(2048)
ConnectionResetError: [Errno 54] Connection reset by peer

问题根源

  1. 重复调用listen():服务端在while True循环内重复执行s.listen(),listen()仅需在绑定端口后调用一次,重复调用会破坏监听状态。
  2. 错误使用套接字收发数据:服务端用主监听套接字s调用recv(),实际应该用accept()返回的连接套接字conn来处理数据收发,主套接字仅负责监听新连接。
  3. 数据处理错误:服务端直接对字节对象调用str(),会生成类似b'123'的字符串,客户端无法直接转换为int,需先解码字节为字符串再返回。
  4. 连接关闭时机问题:服务端未确保数据发送完成就关闭连接,导致客户端接收时连接已被重置。

修正后的代码

服务端代码

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8890))
s.listen(5)  # 仅调用一次监听

while True:
    conn, addr = s.accept()
    print(f"Connection established from address {addr}")
    
    # 使用连接套接字接收数据
    received_bytes = conn.recv(2048)
    if not received_bytes:  # 处理客户端异常断开
        conn.close()
        continue
    
    # 解码后原样返回
    received_str = received_bytes.decode('utf8')
    conn.send(received_str.encode('utf8'))
    
    conn.close()

客户端代码

import socket

choice = input("Select: ")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 8890))

# 发送用户输入的编码后数据
s.send(str(choice).encode('utf8'))

# 接收服务端返回的数据
msg = s.recv(2048)
response_str = msg.decode('utf8')

# 尝试转换为int并处理异常
try:
    num = int(response_str)
    print(f"转换成功,整数为:{num}")
except ValueError:
    print("错误:输入内容无法转换为整数,请输入有效数字")

# 关闭客户端套接字
s.close()

关键优化说明

  • 移除服务端循环内的重复listen()调用,保证监听状态正常。
  • 统一使用conn(连接套接字)处理数据收发,避免混淆主监听套接字。
  • 客户端增加异常捕获,防止非数字输入导致程序崩溃。
  • 服务端增加空数据判断,处理客户端异常断开的边界情况。

内容的提问来源于stack exchange,提问作者giotto1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:40:25