IIC2233 / Syllabus-2023-1

79 stars 44 forks source link

Problema envío objetos mensaje entre servidor y cliente #478

Open maxo2727 opened 1 year ago

maxo2727 commented 1 year ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Hola. Tengo problemas al leer la información enviada desde el servidor al cliente. Cuando envío un objeto de la clase "Mensaje" con sus atributos desde el servidor, y trato de leerlo desde el cliente, tira el error: "AttributeError: Can't get attribute 'Mensaje' on <module 'main' ...". La cosa es que el cliente sí recibe los bytes, los desencripta y decodifica para que se vean igual a como se mandaron desde el servidor. Pero, al tratar de hacer "pickle.loads" en el backend del cliente y crear el objeto de la clase, aparece el error. Trate con mensajes mas simples, como con strings y funciona perfecto. El problema aparece cuando utilizo objetos y trato de cargarlos en el receptor. Además, tengo definida la clase "Mensaje" en servidor y en el backend del cliente. Para correr el código, primero hay que ejecutar el main.py del servidor, después el main.py del cliente y presionar en unirse a partida. Gracias, quedo atento :)

gvfigueroa commented 1 year ago

Hola @maxo2727! Para enviar clases o serializar clases en pickle en general hay que tener en consideración dos cosas:

La primera, es que la clase debe estar definida si o si tanto en el emisor como en el receptor, pues si no el cliente o servidor puede que no sepan de que objeto se trata, debido a que desconoce la clase. Pero por lo que me dices, esto ya lo haces.

La segunda, que tiene que ver un poco con lo mismo, es que la dirección o módulo donde se define el objeto influye en el "nombre" o "dirección" que se le asigna al mismo. Tipo, al instanciar un objeto llamado User en el módulo main, se tiene algo como <main.User object at 0x109fb0350>. Sin embargo, si definimos la clase User en un archivo llamado Usuario.py, va a quedar algo como <Usuario.User object at 0x109fb0350>. Por lo tanto, para que se pueda deserializar correctamente, la clase debe estar definida en un archivo.py con el mismo nombre tanto en el cliente y servidor y ser importado en el módulo donde se vaya a deserializar.

Avísame si esto soluciona tu problema!