Py学习  »  Python

热修复[TypeError:Python3[duplicate]中需要一个类似字节的对象,而不是'str']

Yara • 4 年前 • 733 次点击  

我正在尝试创建一个程序,该程序将在本地计算机上打开一个端口,并让其他人通过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和sockets新手。但当我运行此代码时,它将允许我使用以下命令发送netcat连接:

nc 127.0.0.1 12345

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

TypeError: a bytes-like object is required, not 'str'

我基本上只是试图打开一个端口,让netcat连接,并在那台机器上有一个完整的外壳。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50077
 
733 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Felipe Augusto sjjhsjjh
Reply   •   1 楼
Felipe Augusto sjjhsjjh    4 年前

您可以将发送行更改为:

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

这个 b 改为字节。

phd
Reply   •   2 楼
phd    6 年前

你可以把它解码成str receive.decode('utf_8') .

wescpy
Reply   •   3 楼
wescpy    5 年前

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

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

最佳解决方案(应同时使用2.x和3.x):

output = 'Thank you for connecting'
c.sendall(output.encode('utf-8'))

结语/背景 :这在Python2中不是问题,因为字符串已经是字节字符串了——您的操作代码将在该环境中完美工作。Unicode字符串在1.6&2.0版中添加到Python中,但在3.0版成为默认字符串类型之前一直处于次要地位。另见 this similar question 以及 this one .