发送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
相关产品推荐
相关产品推荐

