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

Socket实现的Web Server仅端口80可用,非80端口报ERR_INVALID_HTTP_RESPONSE

问题分析:Socket Web Server 非80端口返回无效HTTP响应

原代码

from socket import *
import sys

serverSocket = socket(AF_INET, SOCK_STREAM) 
serverPort = 100 

serverSocket.bind('',serverPort) 

serverSocket.listen(1)

while True:

    connectionSocket,addr = serverSocket.accept() 
    try:
        message = connectionSocket.recv(4096).decode()
        filename = message.split()[1][1:]
        with open(filename,"rb") as f:
            output = f.read()

        print(output)

        
        connectionSocket.sendall(output)
        print("Sent successfully.")
        connectionSocket.close()

    except:
        response = b"HTTP/1.1 404 Not Found \r\n\r\n" 
        connectionSocket.send(response)
        connectionSocket.close()

serverSocket.close()

问题原因

核心问题是代码返回的响应缺少完整的HTTP协议头:

  • 当使用80端口时,浏览器默认该端口对应HTTP服务,会“宽容”地尝试解析无协议头的内容;但切换到非80端口后,浏览器对HTTP协议合规性检查更严格,必须收到完整的响应头才能识别有效响应。
  • 你的代码在读取文件后直接发送文件内容(比如HTML),没有添加HTTP状态行、响应头(如Content-Type、Content-Length),浏览器无法识别这是合法的HTTP响应,因此抛出ERR_INVALID_HTTP_RESPONSE错误。

解决方案

修改成功分支代码,构建符合HTTP规范的完整响应:

from socket import *
import sys

serverSocket = socket(AF_INET, SOCK_STREAM) 
serverPort = 100 

serverSocket.bind(('', serverPort)) 

serverSocket.listen(1)

while True:
    connectionSocket, addr = serverSocket.accept() 
    try:
        message = connectionSocket.recv(4096).decode()
        filename = message.split()[1][1:]
        with open(filename, "rb") as f:
            output = f.read()
        
        # 构建完整HTTP响应
        response_header = b"HTTP/1.1 200 OK\r\n"
        # 根据文件类型调整Content-Type,比如图片用image/jpeg,css用text/css
        response_header += b"Content-Type: text/html\r\n"
        response_header += b"Content-Length: " + str(len(output)).encode() + b"\r\n"
        response_header += b"\r\n"  # 响应头与响应体的分隔符
        full_response = response_header + output
        
        connectionSocket.sendall(full_response)
        print("Sent successfully.")
        connectionSocket.close()

    except Exception as e:
        print(f"Error: {e}")
        response = b"HTTP/1.1 404 Not Found\r\n\r\n" 
        connectionSocket.send(response)
        connectionSocket.close()

serverSocket.close()

补充说明

  • HTTP响应必须包含状态行、响应头,最后用\r\n\r\n分隔响应头和响应体,这是协议强制要求。
  • 需根据实际文件类型动态设置Content-Type,否则浏览器可能无法正确渲染内容。

内容的提问来源于stack exchange,提问作者Davut Boztaş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:10:15