Python套接字错误TypeError:需要类似字节的对象,而不是';str';具有发送功能
我试图创建一个程序,在本地机器上打开一个端口,让其他人通过netcat连接到它。我现在的代码是Python套接字错误TypeError:需要类似字节的对象,而不是';str';具有发送功能,python,python-3.x,Python,Python 3.x,我试图创建一个程序,在本地机器上打开一个端口,让其他人通过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')
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连接,并在该机器上安装一个完整的外壳。您可以将发送线路更改为:
c.send(b'Thank you for connecting')
b
将其改为字节。此错误的原因是,在Python 3中,字符串是Unicode,但在网络上传输时,数据需要改为字节。所以有几点建议:
c.sendall()
而不是c.send()
,以防止可能出现的问题,即您可能无法通过一次调用发送整个消息(请参阅)'b'
:c.sendall(b'感谢您的连接')
结语/背景:这在Python2中不是问题,因为字符串已经是字节字符串了——您的操作代码将在该环境中完美工作。Unicode字符串在1.6和2.0版中被添加到Python中,但在3.0版成为默认字符串类型之前一直处于次要地位。另请参见。您可以使用
receive.decode('utf_8')将其解码为str
另一种解决方案是向文件实例引入一种方法,该方法将执行显式转换
import types
def _write_str(self, ascii_str):
self.write(ascii_str.encode('ascii'))
source_file = open("myfile.bin", "wb")
source_file.write_str = types.MethodType(_write_str, source_file)
然后你可以将它用作源文件。写下str(“Hello World”)你试过编码了吗?没有。我可以注释掉c.send,它就会运行。你认为那个字符串需要编码吗?谢谢你。这很有帮助,也回答了我的问题。
import types
def _write_str(self, ascii_str):
self.write(ascii_str.encode('ascii'))
source_file = open("myfile.bin", "wb")
source_file.write_str = types.MethodType(_write_str, source_file)