You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:24:03