python python-3.x

Error de socket de Python TypeError: se requiere un objeto similar a bytes, no ''str'' con función de envío



python-3.x (3)

La razón de este error es que en Python 3, las cadenas son Unicode, pero cuando se transmiten en la red, los datos deben ser cadenas de bytes. Entonces ... un par de sugerencias:

  1. Sugiera usar c.sendall() lugar de c.send() para evitar posibles problemas en los que es posible que no haya enviado todo el mensaje con una sola llamada (ver docs ).
  2. Para literales, agregue una ''b'' para la cadena de bytes: c.sendall(b''Thank you for connecting'')
  3. Para las variables, debe codificar cadenas Unicode en cadenas de bytes (ver más abajo)

La mejor solución (debería funcionar con 2.xy 3.x):

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

Epílogo / antecedentes : esto no es un problema en Python 2 porque las cadenas ya son cadenas de bytes: su código OP funcionaría perfectamente en ese entorno. Las cadenas Unicode se agregaron a Python en las versiones 1.6 y 2.0, pero pasaron a un segundo plano hasta 3.0 cuando se convirtieron en el tipo de cadena predeterminado. También vea esta pregunta similar , así como esta .

Estoy tratando de crear un programa que abra un puerto en la máquina local y permita que otros se conecten a través de netcat. Mi código actual es

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

Soy nuevo en Python y sockets. Pero cuando ejecuto este código, me permitirá enviar una conexión netcat con el comando:

nc 127.0.0.1 12345

Pero luego, en mi script de Python, aparece el error para c.send:

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

Básicamente solo estoy tratando de abrir un puerto, permitir que netcat se conecte y tener un shell completo en esa máquina.


Puede cambiar la línea de envío a esto:

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

La b convierte en bytes en su lugar.


Puede decodificarlo en str con receive.decode(''utf_8'') .