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

Python3.9迁移socket web服务报错TypeError: a bytes-like object is required, not 'str'

报错原因

Python 3 的socket套接字发送方法send()仅支持字节类型的输入,你代码里的404异常分支已经做了字符串转字节的处理,但正常读取文件返回响应的分支没有做对应的转换,读取到的outputdata是字符串类型,直接发送就触发了类型错误。

修复方案

你可以按以下逻辑修改代码:

  • 读取文件时直接读取为字节内容,或者读取字符串后统一转码为字节,不需要逐字符循环发送,既简化代码也能提高传输效率
  • 补充正常响应的HTTP状态行,避免浏览器识别异常
  • 所有调用send()的位置都传入字节类型参数
  • 可以删除原代码里无用的bytes('', 'UTF-8')语句

修复后的完整代码如下:

from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverPort = 8000
serverSocket.bind(('', serverPort))
serverSocket.listen(1)

while True:
    print('Ready to serve...')

    connectionSocket, addr = serverSocket.accept()
    try:
        message = connectionSocket.recv(1500)
        filepath = message.split()[1]
        # 用二进制模式读文件直接得到字节内容,无需后续转码
        with open(filepath[1:], 'rb') as f:
            outputdata = f.read()
        # 发送正常HTTP响应头,b前缀代表字节字面量
        connectionSocket.send(b"HTTP/1.1 200 OK\r\n\r\n")
        # 直接发送整个文件内容
        connectionSocket.send(outputdata)
        connectionSocket.send(b"\r\n")

        connectionSocket.close()

    except IOError:
        connectionSocket.send(b"HTTP/1.1 404 Not Found\r\n\r\n")
        connectionSocket.send(b"<html><head></head><body><h1>404 Not Found</h1></body></html>\r\n")

        connectionSocket.close()
serverSocket.close()

如果你的文件是文本类型,不想用二进制模式读取,也可以读取字符串后调用encode('utf-8')方法转成字节,效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:24:03