当前位置: 首页 > 知识库问答 >
问题:

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

甄文彬
2023-03-14

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

共有3个答案

侯兴为
2023-03-14

您可以将发送行更改为:

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

b将其改为字节。

饶骁
2023-03-14

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

松阳泽
2023-03-14

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

  1. 建议使用c.sendall()而不是c.send(),以防止可能出现的问题,即您可能无法通过一次呼叫发送整个消息(请参阅文档)。
  2. 对于文本,为字节字符串添加一个'b'c.sendall(b'感谢您的连接')
  3. 对于变量,您需要将Unicode字符串编码为字节字符串(见下文)

最佳解决方案(2.x和2.x都适用

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

结语/背景:这在Python2中不是问题,因为字符串已经是字节字符串了——您的操作代码将在该环境中完美工作。Unicode字符串在1.6版中添加到Python中

 类似资料:
  • 以下是尝试使用套接字修改用户提供的输入的代码: 当我执行它并提供输入时,会发生以下错误: 我能做些什么来解决这个问题?

  • 我得到一个“TypeError:需要一个类似字节的对象,而不是'str'”。我在使用StringIO时遇到了一个错误“TypeError:initial_值必须是str或None,而不是bytes”,我在使用Python 3.7。 我也得到这个函数同样的错误。"返回pickle.load(打开(DATA_FILE))"

  • 问题内容: 几年前,我正在使用一个先前提出的问题的代码,但是,我认为这已经过时了。尝试运行代码,我收到上述错误。我仍然是Python的新手,因此无法从类似的问题中得到很多澄清。有人知道为什么会这样吗? 追溯 问题答案: 默认情况下返回stdout或stderr流的对象。这意味着您还需要在针对这些对象的操作中使用对象。使用对象。使用字节文字(注意前缀): 或先解码数据(如果您知道所使用的编码)(通常

  • 我正在运行一个代码,但这一行出现错误: TypeError:需要一个类似字节的对象,而不是str 这里显示的是类型列表的各个部分,是 TypeError:需要一个类似字节的对象,而不是str

  • 我最近迁移到Python 3.5。此代码在Python 2.7中正常工作: 升级到3.5后,我得到了: TypeError:需要类似字节的对象,而不是'str' 错误在最后一行(模式搜索代码)。 我试过使用函数,并尝试: -没用。 我能够解决几乎所有的Python

  • 我在Python 3.6.5。 当使用日志记录我得到以下错误- TypeError:需要一个类似字节的对象,而不是'str' 它在Python2中运行良好。我还尝试将字符串转换为Byte对象,但无法解决问题 我得到以下错误- Traceback(最近一次调用): File"/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/log/