社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Yara • 4 年前 • 721 次点击  

我正在尝试创建一个程序,该程序将在本地计算机上打开一个端口,并让其他人通过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
 
721 次点击  
文章 [ 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 .