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

