Python中如何正确使用socketserver.BaseRequestHandler的handle函数实现while循环接收数据
def handle(self):
connection = self.request
while True:
bytesData = connection.recv(1024)
if not bytesData:
break
strData = byte2Hex(bytesData)
print(strData)
于是我用 TCP 工具去连接,并发送数据,服务端接受数据没问题,但是只要我断开 TCP 连接,服务端就会出现这个错误。ConnectionResetError:(Errno 104)Connection reset by peer,各位大佬帮忙看看。
Python中如何正确使用socketserver.BaseRequestHandler的handle函数实现while循环接收数据
4 回复
断开是 Ctrl + C 还是 name.close() ?
在socketserver.BaseRequestHandler的handle方法里实现while循环接收数据,关键是正确处理连接关闭和异常。直接看代码:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
# self.request 是客户端连接的socket对象
while True:
try:
# 接收数据,这里设置缓冲区大小为1024字节
data = self.request.recv(1024)
if not data: # 客户端正常关闭连接时会收到空数据
print(f"客户端 {self.client_address} 断开连接")
break
# 处理接收到的数据
print(f"收到来自 {self.client_address} 的数据: {data.decode('utf-8')}")
# 可以在这里发送响应
response = f"已收到: {data.decode('utf-8')}"
self.request.sendall(response.encode('utf-8'))
except ConnectionResetError:
print(f"客户端 {self.client_address} 异常断开")
break
except Exception as e:
print(f"处理数据时出错: {e}")
break
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# 创建TCP服务器
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
print(f"服务器启动在 {HOST}:{PORT}")
server.serve_forever()
关键点:
self.request就是客户端socket,可以直接用recv()、sendall()等方法recv(1024)会阻塞直到收到数据或连接关闭- 当
recv()返回空字节b''时,说明客户端正常关闭了连接 - 必须用
try-except捕获ConnectionResetError,处理客户端异常断开的情况 - 收到空数据或异常时要
break退出循环,否则会无限循环
如果需要处理变长数据或特定协议:
def handle(self):
buffer = b""
while True:
try:
chunk = self.request.recv(4096)
if not chunk:
break
buffer += chunk
# 根据你的协议判断是否接收完整
# 例如:以换行符结束
if b'\n' in buffer:
lines = buffer.split(b'\n')
for line in lines[:-1]: # 处理完整的行
self.process_line(line)
buffer = lines[-1] # 保留不完整的部分
except (ConnectionResetError, ConnectionAbortedError):
break
简单说就是:在handle()里用while True循环接收,注意判断空数据和异常处理。
你断开连接报 reset by peer 不是很正常吗?
看着费眼

