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.BaseRequestHandlerhandle方法里实现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()

关键点:

  1. self.request就是客户端socket,可以直接用recv()sendall()等方法
  2. recv(1024)会阻塞直到收到数据或连接关闭
  3. recv()返回空字节b''时,说明客户端正常关闭了连接
  4. 必须用try-except捕获ConnectionResetError,处理客户端异常断开的情况
  5. 收到空数据或异常时要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 不是很正常吗?

看着费眼

回到顶部