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

推荐答案

这个错误的原因是,在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'))

Epilogue/background:这在Python 2中不是问题,因为字符串已经是字节字符串了——您的操作代码在这种环境下可以完美地工作.Unicode字符串在1.6版和;但在3.0成为默认字符串类型之前,它们一直处于次要地位.同时参见this similar questionthis one.

Python-3.x相关问答推荐

这是重命名极地df列的最好方式吗?

像计数不显示在html和想知道如果我的模型设置正确

从PYTHON中获取单行和多行的Rguar表达式

从列表的元素和python中的多个多索引数据帧执行方程

移动所有列的数据帧值以使其单调递增

在不改变 python 中原始数组顺序的情况下,对多维字符串数组进行降序排序?

Python:如何在Pandas 的 .agg 函数中使用 value_counts()?

如何在 Python 中 cv2 的窗口标题上动态更新 FPS

如何在两个矩阵的比较中允许任何列的符号差异,Python3?

如果值超出上下限(异常值处理),则将值的数据框替换为 np.nan

python 3.10.5 中可能存在的错误. id 函数工作不明确

如何在python 3.10中将列表项(字符串类型)转换为模块函数

找到操作系统的图片文件夹的 CLI

通过最接近的匹配合并两个不同长度的列上的两个数据框

每个数据行中每个数据帧值的总和

Python3 AttributeError:列表对象没有属性清除

保存 StandardScaler() 模型以用于新数据集

在 Python 3.5 中使用 aiohttp 获取多个 url

Linux Mint 上的 Python3 错误没有名为蓝牙的模块

TypeError:无法实例化类型元组;使用 tuple() 代替