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

Python编写简易TCP服务器问题:浏览器显示HTML源码而非页面

问题解决:浏览器显示HTML源码的原因及修复

问题根源是你的HTTP响应没有告知浏览器返回内容的类型,浏览器默认按纯文本解析,所以直接展示了HTML源码。以下是修复方案:

核心修改点

  1. 添加Content-Type响应头:必须在HTTP头里明确Content-Type: text/html; charset=utf-8,告诉浏览器这是HTML文件
  2. 修正字节流发送:所有通过socket发送的内容都要编码成字节(.encode()),否则会抛出类型错误
  3. 优化内容发送:无需循环逐个字符发送,直接发送整个文件内容的字节流即可
  4. 修复代码细节:异常处理的缩进、HTTP版本统一、文件资源自动释放

修复后的完整代码

from socket import *

serverSocket = socket(AF_INET, SOCK_STREAM) 
serverPort = 12001
serverSocket.bind(('127.0.0.1', serverPort))
serverSocket.listen(1)

while True:
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()

    try:
        message = connectionSocket.recv(1024).decode()
        filename = message.split()[1]
        # 使用with语句自动关闭文件,避免资源泄漏
        with open(filename[1:], 'r', encoding='utf-8') as f:
            outputdata = f.read()
        
        # 发送完整的HTTP响应头,包含Content-Type
        response_header = 'HTTP/1.1 200 OK\r\n'
        response_header += 'Content-Type: text/html; charset=utf-8\r\n'
        response_header += '\r\n'  # 空行分隔头和内容
        connectionSocket.send(response_header.encode())
        
        # 直接发送整个文件内容的字节流
        connectionSocket.send(outputdata.encode())
        connectionSocket.close()
    except IOError:
        # 统一用HTTP/1.1,返回404响应头
        print('404 Not Found')
        response_404 = 'HTTP/1.1 404 Not Found\r\n'
        response_404 += 'Content-Type: text/plain; charset=utf-8\r\n'
        response_404 += '\r\nFile Not Found'
        connectionSocket.send(response_404.encode())
        connectionSocket.close()

关键修改解释

  • Content-Type头:这是让浏览器正确解析HTML的核心,没有它浏览器会把返回的所有内容当成纯文本
  • with语句:自动管理文件资源,不用手动调用f.close(),避免忘记关闭导致的资源泄漏
  • 批量发送内容:循环发送单个字符效率极低,直接发送整个字符串的字节流更高效
  • HTTP版本统一:避免混合使用1.1和1.0,保持响应的规范性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:21:40