Python编写简易TCP服务器问题:浏览器显示HTML源码而非页面
问题解决:浏览器显示HTML源码的原因及修复
问题根源是你的HTTP响应没有告知浏览器返回内容的类型,浏览器默认按纯文本解析,所以直接展示了HTML源码。以下是修复方案:
核心修改点
- 添加Content-Type响应头:必须在HTTP头里明确
Content-Type: text/html; charset=utf-8,告诉浏览器这是HTML文件 - 修正字节流发送:所有通过socket发送的内容都要编码成字节(
.encode()),否则会抛出类型错误 - 优化内容发送:无需循环逐个字符发送,直接发送整个文件内容的字节流即可
- 修复代码细节:异常处理的缩进、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
相关产品推荐
相关产品推荐

