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

