Python 套接字错误 TypeError:需要一个类似字节的对象,而不是带有发送函数的“str" [英] Python sockets error TypeError: a bytes-like object is required, not 'str' with send function

查看:51
本文介绍了Python 套接字错误 TypeError:需要一个类似字节的对象,而不是带有发送函数的“str"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个程序,该程序将在本地计算机上打开一个端口,并让其他人通过 netcat 连接到该端口.我当前的代码是.

I am trying to create a program that will open a port on the local machine and let others connect into it via netcat. My current code is.

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 连接:

I am new to Python and sockets. But when I run this code it will allow me to send a netcat connection with the command:

nc 127.0.0.1 12345

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

But then on my Python script I get the error for the c.send:

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

我基本上只是想打开一个端口,允许 netcat 连接并在该机器上拥有一个完整的外壳.

I am basically just trying to open a port, allow netcat to connect and have a full shell on that machine.

推荐答案

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

The reason for this error is that in Python 3, strings are Unicode, but when transmitting on the network, the data needs to be bytes instead. So... a couple of suggestions:

  1. 建议使用 c.sendall() 而不是 c.send() 以防止可能出现的问题,即您可能没有通过一次调用发送整个 msg(请参阅 docs).
  2. 对于文字,为字节字符串添加一个 'b':c.sendall(b'Thank you for connection')
  3. 对于变量,您需要将 Unicode 字符串编码为字节字符串(见下文)
  1. Suggest using c.sendall() instead of c.send() to prevent possible issues where you may not have sent the entire msg with one call (see docs).
  2. For literals, add a 'b' for bytes string: c.sendall(b'Thank you for connecting')
  3. For variables, you need to encode Unicode strings to byte strings (see below)

最佳解决方案(应该适用于 2.x 和 3.x):

Best solution (should work w/both 2.x & 3.x):

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

尾声/背景:这在 Python 2 中不是问题,因为字符串已经是字节字符串——您的 OP 代码将在该环境中完美运行.Unicode 字符串在 1.6 版和2.0 但在 3.0 成为默认字符串类型之前退居次要位置.另请参阅这个类似的问题以及这个问题.

Epilogue/background: this isn't an issue in Python 2 because strings are bytes strings already -- your OP code would work perfectly in that environment. Unicode strings were added to Python in releases 1.6 & 2.0 but took a back seat until 3.0 when they became the default string type. Also see this similar question as well as this one.

这篇关于Python 套接字错误 TypeError:需要一个类似字节的对象,而不是带有发送函数的“str"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆