Python socket搭建HTTPServer时CSS响应一直pending该如何解决
问题排查与修复
核心问题点
- HTTP 1.1协议默认开启长连接(keep-alive),你的响应没有加
Content-Length头告知浏览器响应体长度,也没有主动通知浏览器关闭连接,浏览器无法判断响应是否传输完成,因此一直处于pending等待状态。 - 响应报文的行分隔符不符合HTTP规范,HTTP要求头字段之间用
\r\n分隔,头和响应体之间用\r\n\r\n分隔,你当前代码里用的是普通\n,存在解析异常风险。 /style.css路由分支中存在冗余无效代码res="Content-Type: text/css\n\n"+css_file.read(),你没有提前定义、打开css_file变量,运行到该行时会抛出IO异常,导致后续响应发送失败。- 数据处理逻辑顺序错误,你先解码处理收到的数据,再判断数据是否为空,空数据解码会直接抛出异常,中断连接处理逻辑。
修复方案
调整响应报文格式,添加Connection: close头通知浏览器响应结束后断开连接,删除冗余代码,调整数据处理顺序,修复后的代码如下:
import socket import threading pars = ('127.0.0.1', 8888) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 避免重启服务时端口占用 s.bind(pars) s.listen(5) # 调整响应格式,用\r\n做规范换行,添加Connection头通知关闭连接 res_for_good = '''HTTP/1.1 200 OK\r Content-Type: text/html\r Connection: close\r \r <head> <link rel="stylesheet" href="./style.css" type="text/css"> </head> <html> <body>good HaHa</body> </html> ''' res_for_style='''HTTP/1.1 200 OK\r Content-Type: text/css\r Connection: close\r \r body{ color: red; } ''' def serveClient(clientsocket, address): while True: data = clientsocket.recv(1024) # 优先判断空数据,避免解码报错 if data == b'': clientsocket.close() break data_utf8 = data.decode('utf-8').split('\r\n') req_line = data_utf8[0] # 用elif避免重复匹配 if '/good.html' in req_line: clientsocket.sendall(res_for_good.encode()) elif '/style.css' in req_line: print("transfer css") clientsocket.sendall(res_for_style.encode()) else: # 兜底处理未知路径,避免无响应 not_found_resp = b'HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\nPage Not Found' clientsocket.sendall(not_found_resp) # 发完响应主动关闭连接,结束本次请求 clientsocket.close() break while True: (clientsocket, address) = s.accept() threading.Thread(target = serveClient, args = (clientsocket, address)).start()
内容的提问来源于stack exchange,提问作者Ying
相关产品推荐
相关产品推荐

