Python套接字错误TypeError:需要一个类似字节的对象,而不是带有send函数的'str'

sql*_*sql 20 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')
    c.close()
Run Code Online (Sandbox Code Playgroud)

我是Python和套接字的新手.但是当我运行此代码时,它将允许我使用命令发送netcat连接:

nc 127.0.0.1 12345
Run Code Online (Sandbox Code Playgroud)

但是在我的Python脚本上,我得到了c.send的错误:

TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)

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

wes*_*cpy 39

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

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

最佳方案:

output = 'Thank you for connecting'
c.sendall(output.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

结语/背景:这不是Python 2中的问题,因为字符串已经是字节字符串 - 您的OP代码将在该环境中完美地运行.在Python 1.6/2.0中添加了Unicode字符串,当它们成为默认字符串类型时,它们退居三线.另见这个问题.

  • 这次真是万分感谢.这非常有帮助,也回答了我的问题. (2认同)

Ere*_*ıcı 7

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


小智 5

您可以将发送行更改为此:

c.send(b'Thank you for connecting')
Run Code Online (Sandbox Code Playgroud)

b使得它字节而不是。