我正在尝试创建一个程序,它将在本地计算机上打开一个端口并让其他人通过 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 许可协议
出现这个错误的原因是在Python 3中,字符串是Unicode,但是在网络上传输时,数据需要改为字节。所以……一些建议:
c.sendall()
而不是c.send()
以防止您可能没有通过一个电话发送整个消息的可能问题(请参阅 文档)。'b'
:c.sendall(b'Thank you for connecting')
最佳解决方案(应该适用于 2.x 和 3.x):
_结语/背景_:这在 Python 2 中不是问题,因为字符串已经是字节字符串——您的 OP 代码将在该环境中完美运行。 Unicode 字符串在 1.6 和 2.0 版本中被添加到 Python,但在 3.0 成为默认字符串类型时退居二线。另请参阅 此类似问题 以及 此 问题。