Python套接字错误TypeError:需要一个类似字节的对象,而不是带有发送功能的'str'
问题描述
我正在尝试创建一个程序,该程序将在本地计算机上打开一个端口并让其他人通过 netcat 连接到它.我当前的代码是.
I am trying to create a program that will open a port on the local machine and let others connect into it via netcat. My current code is.
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 连接:
I am new to Python and sockets. But when I run this code it will allow me to send a netcat connection with the command:
nc 127.0.0.1 12345
但是在我的 Python 脚本中,我收到了 c.send 的错误:
But then on my Python script I get the error for the c.send:
TypeError: a bytes-like object is required, not 'str'
我基本上只是想打开一个端口,允许 netcat 连接并在那台机器上拥有一个完整的 shell.
I am basically just trying to open a port, allow netcat to connect and have a full shell on that machine.
解决方案
这个错误的原因是在Python 3中,字符串是Unicode,但是在网络上传输时,数据需要是字节.所以...一些建议:
The reason for this error is that in Python 3, strings are Unicode, but when transmitting on the network, the data needs to be bytes instead. So... a couple of suggestions:
- 建议使用
c.sendall()
而不是c.send()
以防止可能出现的问题,即您可能没有通过一次调用发送整个 msg(请参阅 docs). - 对于文字,为字节字符串添加
'b'
:c.sendall(b'Thank you for connection')
- 对于变量,您需要将 Unicode 字符串编码为字节字符串(见下文)
- Suggest using
c.sendall()
instead ofc.send()
to prevent possible issues where you may not have sent the entire msg with one call (see docs). - For literals, add a
'b'
for bytes string:c.sendall(b'Thank you for connecting')
- For variables, you need to encode Unicode strings to byte strings (see below)
最佳解决方案(应同时使用 2.x 和 3.x):
Best solution (should work w/both 2.x & 3.x):
output = 'Thank you for connecting'
c.sendall(output.encode('utf-8'))
结语/背景:这在 Python 2 中不是问题,因为字符串已经是字节字符串——您的 OP 代码可以在该环境中完美运行.Unicode 字符串在 1.6 & 版本中被添加到 Python 中.2.0 但在 3.0 成为默认字符串类型之前退居二线.另请参阅 this similar question 以及 this one.
Epilogue/background: this isn't an issue in Python 2 because strings are bytes strings already -- your OP code would work perfectly in that environment. Unicode strings were added to Python in releases 1.6 & 2.0 but took a back seat until 3.0 when they became the default string type. Also see this similar question as well as this one.
相关文章