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

发送GET请求后忽略返回HTML,ESP-8266服务器卡顿问题求助

问题分析与解决方案

你的核心问题在于没有读取服务器返回的响应内容,导致TCP连接的接收缓冲区被填满,进而让ESP-8266服务器卡在发送流程里,最终超时挂起。

HTTP协议的交互逻辑里,客户端发送请求后,服务器会返回响应数据,而TCP协议要求接收方确认收到数据。如果你的Python程序一直不读取响应,树莓派的TCP接收缓冲区会被服务器返回的HTML内容填满,此时服务器会因为客户端的接收窗口关闭(缓冲区已满)而无法继续发送数据,只能等待,直到触发超时——这就是你看到的服务器挂起现象。当你减少返回内容时,缓冲区没被填满,服务器能顺利发送完所有数据,自然不会出现问题。

解决方法

你需要在代码中主动读取并丢弃服务器的响应内容,确保TCP缓冲区被清空,让服务器完成发送流程。具体可以这样修改:

import socket
import http.client

htmlString = ("/Interior, /COLOR,r="+str(dimPixelIn[0]).zfill(3)+",g="+str(dimPixelIn[1]).zfill(3)+",b="+str(dimPixelIn[2]).zfill(3))
conn = http.client.HTTPConnection(awningAddress, timeout=1)  # 适当延长超时时间,避免读取响应时超时
try:
    conn.request("GET", htmlString)
    # 关键:获取响应并读取所有内容(哪怕要丢弃)
    resp = conn.getresponse()
    # 读取响应内容,若内容过大可分块读取避免内存占用
    while resp.read(4096):
        pass
except socket.timeout as sto:
    print("请求或读取响应超时:", sto)
except http.client.HTTPException as Exc:
    print("HTTP请求异常:", Exc)
finally:
    conn.close()

关键改动说明

  • 必须读取响应:conn.getresponse()获取响应对象后,通过循环分块读取(或直接resp.read())会把服务器返回的所有内容读走,这样TCP接收缓冲区会被清空,服务器能收到客户端的确认,顺利完成连接流程。
  • 调整超时时间:原来的timeout=0.3可能太短,导致还没读完响应就触发超时,建议根据服务器返回内容的大小适当延长,比如设置为1秒。
  • 移除重复close:原代码里finally块调用了两次conn.close(),一次就足够,重复调用没有实际意义。

这样修改后,服务器就不会因为客户端不接收数据而挂起,同时也不需要修改服务器的返回内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:50