Python套接字错误TypeError : a bytes-like object is required, not 'str' with send function

标签 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()

我是 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 connection')
  3. 对于变量,您需要将 Unicode 字符串编码为字节字符串(见下文)

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

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

结语/背景:这在 Python 2 中不是问题,因为字符串已经是字节字符串——您的 OP 代码可以在该环境中完美运行。 Unicode 字符串在 1.6 和 2.0 版本中被添加到 Python 中,但直到 3.0 版本成为默认字符串类型时才退居次要地位。另请参阅 this similar questionthis one

关于Python套接字错误TypeError : a bytes-like object is required, not 'str' with send function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42612002/

相关文章:

python - 无法从字符串中删除 "\r\n"

python - 打印列表中超过 5 个字符的每个项目的前三个字符

python - 在 Odoo 8 上设置树字体

python - 如何将函数应用于元素集合

python - 有条件地加入 Jinja 中的字符串列表

python - 管理网站静态信息并在网站上实现搜索 API 的最佳方法是什么?

python-3.x - 如何查看加载失败的页面? ( Selenium 。Python)

python - 函数调用中有多个 kwargs?

MySQL 和 pymysql 一起消失了

python - 返回范围内一组数字的所有最小公倍数