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

