Python套接字错误TypeError:需要类似字节的对象,而不是';str';具有发送功能

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')

我试图创建一个程序,在本地机器上打开一个端口,让其他人通过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连接,并在该机器上安装一个完整的外壳。

您可以将发送线路更改为:

c.send(b'Thank you for connecting')

b
将其改为字节。

此错误的原因是,在Python 3中,字符串是Unicode,但在网络上传输时,数据需要改为字节。所以有几点建议:

  • 建议使用
    c.sendall()
    而不是
    c.send()
    ,以防止可能出现的问题,即您可能无法通过一次调用发送整个消息(请参阅)
  • 对于文本,为字节字符串添加一个
    'b'
    c.sendall(b'感谢您的连接')
  • 对于变量,您需要将Unicode字符串编码为字节字符串(见下文)
  • 最佳解决方案(应同时适用于2.x和3.x):


    结语/背景:这在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)