Python 套接字错误 TypeError: a bytes-like object is required, not 'str' with send function

新手上路,请多包涵

我正在尝试创建一个程序,它将在本地计算机上打开一个端口并让其他人通过 netcat 连接到它。我现在的代码是。

 s = socket.socket()
host = '127.0.0.1'
port = 12345
s.bind((host, port))

s.listen(5)
while True:
    c, addr = s.accept()
    print('Got connection from', addr)
    c.send('Thank you for connecting')
    c.close()

我是 Python 和套接字的新手。但是当我运行这段代码时,它将允许我使用以下命令发送一个 netcat 连接:

 nc 127.0.0.1 12345

但随后在我的 Python 脚本中,我得到了 c.send 的错误:

 TypeError: a bytes-like object is required, not 'str'

我基本上只是想打开一个端口,允许 netcat 连接并在该机器上拥有一个完整的 shell。

原文由 sqlsqlsql 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答

出现这个错误的原因是在Python 3中,字符串是Unicode,但是在网络上传输时,数据需要改为字节。所以……一些建议:

  1. 建议使用 c.sendall() 而不是 c.send() 以防止您可能没有通过一个电话发送整个消息的可能问题(请参阅 文档)。
  2. 对于文字,为字节字符串添加 'b'c.sendall(b'Thank you for connecting')
  3. 对于变量,您需要将 Unicode 字符串编码为字节字符串(见下文)

最佳解决方案(应该适用于 2.x 和 3.x):

 output = 'Thank you for connecting'
c.sendall(output.encode('utf-8'))

_结语/背景_:这在 Python 2 中不是问题,因为字符串已经是字节字符串——您的 OP 代码将在该环境中完美运行。 Unicode 字符串在 1.6 和 2.0 版本中被添加到 Python,但在 3.0 成为默认字符串类型时退居二线。另请参阅 此类似问题 以及 问题。

原文由 wescpy 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 receive.decode('utf_8') 将其解码为 str 。

原文由 Eren Arıcı 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题