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

使用HTTP/1.1协议时style.css未复用同一条TCP连接的问题排查

问题原因与解决方案

核心问题:请求处理逻辑错误导致单请求返回多响应

你当前的请求判断使用了多个独立if分支,而非互斥的if-elif分支:

  • 当请求/good.html时,第一个if命中返回正常响应后,后续判断/redirect.html不命中,会触发elif data:分支额外返回404响应
  • 客户端在同一个TCP连接中收到非法的双响应,会判定该连接异常,主动断开连接,后续请求style.css时只能新建TCP连接,就出现了端口变化的情况

次要问题:部分响应的Content-Length值与实际内容长度不匹配

你可以实际计算响应体的字节长度,修正各个res_*变量中的Content-Length头取值,长度不符也会导致客户端认为连接传输异常,主动断开持久连接。

修复代码

首先修正serveClient函数中的请求判断逻辑:

def serveClient(clientsocket, address):
    start = datetime.now()
    objcount=0
    while True:
        objcount+=1
        data = clientsocket.recv(1024)
        if not data:
            objcount -=1
            break
        data_utf8=data.decode('utf-8').split('\r\n')
        print(address)
        print(data)
        # 改成互斥分支,一次请求只返回一个响应
        if '/good.html' in data_utf8[0]:
            clientsocket.sendall(res_for_good.encode())
        elif '/style.css' in data_utf8[0]:
            print("transfer css")
            clientsocket.sendall(res_for_style.encode())
        elif '/redirect.html' in data_utf8[0]:
            clientsocket.sendall(res_for_redirect.encode())
        else:
            clientsocket.sendall(res_for_notfound.encode())    
        
        print("object count: " + str(objcount))
        now = datetime.now()
        if objcount == max_rec_Object or (now-start).total_seconds()>waiting_time:
            print(start)
            print(now)
            print('close socket')
            clientsocket.close()
            break

其次核对每个响应的Content-Length:以res_for_good为例,统计响应头后空行之后的所有内容字节数,替换原有Content-Length的取值即可。

内容的提问来源于stack exchange,提问作者Ying

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:02