real - socket python 3 example
TypeError: se requiere un objeto similar a bytes, no ''str'' (5)
El siguiente es el código que intenta modificar la entrada proporcionada por un usuario mediante sockets:
from socket import *
serverName = ''127.0.0.1''
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input(''Input lowercase sentence:'')
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print (modifiedMessage)
clientSocket.close()
Cuando lo ejecuto y proporciono la entrada, se produce el siguiente error:
Input lowercase sentence:fdsgfdf
Traceback (most recent call last):
File "C:/srinath files/NETWORKS/UDPclient.py", line 6, in <module>
clientSocket.sendto(message,(serverName, serverPort))
TypeError: a bytes-like object is required, not ''str''
¿Qué puedo hacer para resolver esto?
Este código probablemente sea bueno para Python 2. Pero en Python 3, esto causará un problema, algo relacionado con la codificación de bits.
Estaba tratando de hacer un servidor TCP simple y encontré el mismo problema.
La codificación funcionó para mí.
Prueba esto con el comando
sendto
.
clientSocket.sendto(message.encode(),(serverName, serverPort))
Del mismo modo, usaría
.decode()
para recibir los datos en el lado del servidor UDP, si desea imprimirlos exactamente como se enviaron.
La codificación y decodificación pueden resolver esto en Python 3:
Lado del cliente:
>>> host=''127.0.0.1''
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.connect((host,port))
>>> st=''connection done''
>>> byt=st.encode()
>>> s.send(byt)
15
>>>
Lado del servidor:
>>> host=''''
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.bind((host,port))
>>> s.listen(1)
>>> conn ,addr=s.accept()
>>> data=conn.recv(2000)
>>> data.decode()
''connection done''
>>>
Siempre que encuentre un error con este mensaje,
use
my_string.encode()
.
(donde
my_string
es la cadena que está pasando a una función / método).
El método de
encode
de los objetos
str
devuelve la versión codificada de la cadena como un
objeto de
bytes
que luego puede usar.
En esta instancia específica, los métodos de socket
como
.send
esperan que se
.send
un objeto de bytes
como datos,
no un objeto de cadena
.
Como tiene un objeto de tipo
str
y lo pasa a una función / método que espera un objeto de tipo
bytes
, se
bytes
un error que explica claramente que:
TypeError: a bytes-like object is required, not ''str''
Por lo tanto, se necesita el método de
encode
de cadenas, aplicado a un valor de
str
y devolviendo un valor de
bytes
:
>>> s = "Hello world"
>>> print(type(s))
<class ''str''>
>>> byte_s = s.encode()
>>> print(type(byte_s))
<class ''bytes''>
>>> print(byte_s)
b"Hello world"
Aquí el prefijo
b
en
b''Hello world''
denota que este es realmente un objeto de bytes.
Luego puede pasarlo a cualquier función que esté esperando para que funcione sin problemas.
Simplemente reemplace el parámetro de mensaje pasado en
clientSocket.sendto(message,(serverName, serverPort))
a
clientSocket.sendto(message.encode(),(serverName, serverPort))
.
Entonces correría con éxito en
python3
Un poco de codificación puede resolver esto:
Lado del cliente:
message = input("->")
clientSocket.sendto(message.encode(''utf-8''), (address, port))
Lado del servidor:
data = s.recv(1024)
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode(''utf-8''))