Python encode()方法失效?socket发送时类型错误排查求助
问题分析与解决
我一眼就瞅到问题出在哪啦——你在拼接请求内容的时候,把字符串(str)和字节流(bytes)混在一起操作了!
错误根源
你写的 'GET '+payload.encode()+' HTTP/1.1\n\n' 这段代码里:
'GET '和' HTTP/1.1\n\n'是字符串类型(str)payload.encode()执行后返回的是字节流类型(bytes)
Python完全不允许直接把str和bytes类型拼接,这就是你收到 TypeError: must be str, not bytes 的直接原因——这个错误在你拼接内容的时候就触发了,根本没走到 robot.send() 那一步,所以你预期的"需要bytes对象"的错误自然不会出现。
两种修复方案
你只需要保证最终传给 send() 的是完整的bytes对象就行,有两种简单的实现方式:
方案1:直接拼接bytes对象
给字符串部分加上 b 前缀,把它们转成bytes后再拼接:
robot.send(b'GET ' + payload.encode() + b' HTTP/1.1\n\n')
方案2:先拼接完整字符串,再统一编码
先把所有内容拼成一个字符串,最后再调用 encode() 转成bytes:
request_msg = f'GET {payload} HTTP/1.1\n\n' robot.send(request_msg.encode())
修正后的完整代码
这里给你整理好的可运行代码,还加了 finally 确保socket一定会被关闭:
import socket ip = socket.gethostbyname("google.com") port = 80 robot = socket.socket(socket.AF_INET, socket.SOCK_STREAM) payload = "Hello world" try: robot.connect((ip, port)) # 选上面任意一种方案即可,这里用方案2举例 request_msg = f'GET {payload} HTTP/1.1\n\n' robot.send(request_msg.encode()) # 如果你想查看响应,可以添加这行代码 # print(robot.recv(4096).decode()) except socket.error as e: print(f"connection lost: {e}") finally: robot.close()
内容的提问来源于stack exchange,提问作者user9411568




