Firefox出现连接重置错误:Python Socket服务端发完数据即关闭连接异常
问题原因分析
- 不符合HTTP协议规范:浏览器作为HTTP客户端,向服务端发送的是标准HTTP请求报文,要求服务端返回符合RFC规范的HTTP响应。你当前代码直接将请求原文回传给浏览器,浏览器无法识别为合法响应,会认为连接异常。
- TCP连接关闭逻辑错误:你在调用
sendall()后直接关闭连接,此时如果浏览器还有未发送完成的请求数据、或者内核中存在未确认的TCP报文,系统内核会直接返回RST包中断连接,而不是走正常的四次挥手流程,这就是Firefox提示「连接被重置」的直接原因。
修复方案
需要做两处调整:
- 构造合法的HTTP响应报文,将你要回显的内容放到响应体中
- 调整连接关闭逻辑,发送完数据后先关闭写端,等待客户端主动断开,避免发送RST包
修复后代码
#!/usr/bin/env python3 import socket HOST = 'localhost' # loopback interface address PORT = 3000 # non-privileged ports are > 1023 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 增加端口复用配置,避免重启时端口占用 s.bind((HOST, PORT)) s.listen() while True: conn, addr = s.accept() with conn: print('Connected by', addr) data = conn.recv(1024).decode() print(data) # 构造符合规范的HTTP响应 resp_body = data.encode() resp_header = [ b'HTTP/1.1 200 OK', b'Content-Type: text/plain;charset=utf-8', f'Content-Length: {len(resp_body)}'.encode(), b'Connection: close', b'', b'' # 空行分隔响应头和响应体 ] full_resp = b'\r\n'.join(resp_header) + resp_body conn.sendall(full_resp) # 先关闭写端通知客户端数据发送完成 conn.shutdown(socket.SHUT_WR) # 读取客户端剩余传输内容,避免触发RST错误 while True: leftover = conn.recv(1024) if not leftover: break
修复后访问服务即可看到浏览器正常展示收到的HTTP请求全文,不会再触发连接重置错误。
内容的提问来源于stack exchange,提问作者Chuan
相关产品推荐
相关产品推荐

