tutorialspoint socket real example espaƱol python python-3.x sockets

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