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

Python使用socket返回HTTP响应触发WinError 10053错误如何解决

错误原因
  1. 非法的预发送内容:TCP连接建立后,你在没有收到HTTP请求的前提下,先发送了Connected to the apps server!!!字符串,不符合HTTP协议规范。浏览器识别到非法响应后会主动断开连接,后续你发送正式HTTP响应时,连接已经被关闭,触发10053错误。
  2. 连接关闭逻辑错误:响应头中你指定了Connection: close,要求响应返回后立即断开连接,但你发送完响应后没有主动关闭客户端socket,反而执行了sleep(5)。此时浏览器收到完整响应后会先断开连接,下一轮循环调用c.recv()或发送操作时,就会触发连接已被中止的报错。
  3. 请求终止判断错误:recv()方法在对端断开连接时返回的是空字节b''而非None,你写的if(msg!=None)判断无法识别连接断开的状态,会继续向已关闭的连接发送数据,触发报错。

另外你提到的转encode后才出现错误属于逻辑巧合:转encode前发送字符串会直接抛出类型错误终止代码运行,不会触发后续的网络交互逻辑,转encode后代码可以正常执行,才暴露了之前的协议逻辑问题。

解决方案

按以下步骤修改代码即可解决问题:

  • 删除TCP连接建立后、收到HTTP请求前的c.send(bytes("Connected to the apps server!!!","utf-8"))语句,不要发送不符合HTTP规范的内容。
  • 调整请求判断逻辑,收到空字节时主动终止当前连接的处理流程。
  • 发送完所有响应内容后主动关闭客户端socket,不需要保留连接等待。
  • 单次请求处理完成后重置连接变量,回到监听新连接的逻辑,支持多次请求处理。

修正后的完整代码

import socket

server_socket1 = socket.socket() # 默认是SOCK_STREAM (TCP),使用AF_INET (IPv4)协议
server_socket1.bind(('127.0.0.1',9999)) # 绑定服务端接收连接的IP和端口
server_socket1.listen(2) # 当前仅接受2个连接,每个客户端对应一个
print("Server started successfully!!!")
print("Waiting for connections...\n\n")

while True:
    # 每次处理完一个连接后回到等待新连接的逻辑
    c,addr = server_socket1.accept()
    print("User connected to client1 socket!!")
    print("Client connected ip address "+str(addr))
    
    try:
        msg = c.recv(4096)
        if len(msg) == 0:
            c.close()
            continue
        headers, sep, body = msg.partition(b'\r\n\r\n')
        headers = headers.decode('utf-8') 
        print(headers)

        html_body = "<html><body><h1>This is a test</h1><p>More content here</p></body></html>"
        response_headers = {
            'Content-Type': 'text/html; encoding=utf8',
            'Content-Length': len(html_body),
            'Connection': 'close',
        }

        response_headers_raw = ''.join('%s: %s\r\n' % (k, v) for k, v in response_headers.items())
        response_proto = 'HTTP/1.1'
        response_status = '200'
        response_status_text = 'OK'

        # 发送响应内容
        r = '%s %s %s\r\n' % (response_proto, response_status, response_status_text)
        c.sendall(r.encode())
        c.sendall(response_headers_raw.encode())
        c.sendall(b'\r\n') # 分隔响应头和响应体
        c.send(html_body.encode(encoding="utf-8"))
    finally:
        # 处理完成后主动关闭连接
        c.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 12:15:10