IIC2233 / syllabus-2020-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
https://iic2233.github.io
7 stars 57 forks source link

error al usar json loads #1237

Closed elchocman closed 3 years ago

elchocman commented 3 years ago

Al crear funciones recibir y enviar tanto en el servidor como en el cliente mande los bytes a que se decodifiiquen a una funcion decodificar y codificar (tal como en la af05), la cosa es que el mensaje que mande a json.loads(mensaje) retorna un error que nose como solucionar. Adjunto el error:

mensaje = json.loads(bytes_mensaje)

File "C:\Users\matia\AppData\Local\Programs\Python\Python37\lib\json__init__.py", line 343, in loads s = s.decode(detect_encoding(s), 'surrogatepass') File "C:\Users\matia\AppData\Local\Programs\Python\Python37\lib\encodings\utf_32_le.py", line 11, in decode return codecs.utf_32_le_decode(input, errors, True) UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 4-7: code point not in range(0x110000)

Si es que saben la razon de pq esto podria pasar estaria muy agradecido

matiasmasjuan commented 3 years ago

Hola @elchocman !

Este error es de codificación, por lo que la causa de esto sería en un problema en el portocolo de envío de mensajes. En particular, podrías hacer un print(byte_mensaje) antes de hacerle un json.loads(bytes_mensaje). Si te das cuenta que el mensaje está cortado, lo mas probable es que estes haciendo mal el protocolo o los rangos de los bytes que vas enviando. Si no está cortado pero te das cuenta que el mensaje muestra bytes ceros (b'\x00'), deberás quitarlos antes de hacer el json.loads(mensaje), de lo contrario te lanzará el error. Si ya probaste estas dos cosas y estas 100% seguro de que el mensaje está correcto pero aún así te muestra el error, por favor haz un push a tu repositorio para que lo pueda revisar.

Saludos! :smile:

elchocman commented 3 years ago

ya lo solucioneee gracias, ahora mi problema es otro que talvez si lo puedas solucionar, la cosa es que cree un metodo para que mande un senal cuando hayan 4 jugadores en la sala de espera y automaticamente se abra la ventana de juego, la cosa es que si yo ingreso al juego a cada cliente por separado solo se abre la ventana de juego al primer cliente que ingreso. (A todo esto hice una ventana de inicio antes de la ventana de espera donde uno ingrese con un nombre elegido por uno mismo, ya que encontraba bastante confuso usar nombres al azar y despues no saber que nombre era de que jugador)

elchocman commented 3 years ago

@matiasmasjuan

matiasmasjuan commented 3 years ago

En ese caso el error es mas difícil de ver :thinking: . ¿Estás seguro de que estás enviando un mensaje desde el servidor a todos los clientes para que habrán su ventana de juego? ¿o solamente lo estás enviando el mensaje a un cliente? ¿Podrías hacer un push a tu repositorio?

elchocman commented 3 years ago

claro, voy a hacer un push ahora

elchocman commented 3 years ago

graciaaaas

matiasmasjuan commented 3 years ago

Revisando tu código, observé que hay un problema en el método aumentar_jugadores(self) en el módulo ventana_espera.py. Resulta que esté método suma 1 a la cantidad de jugadores que hay en la sala de espera. Sin embargo, esto es un error, ya que estas sumando uno cada vez que ingresa uno nuevo, pero no contabilizas los que se han unido antes. Te pondré el siguiente ejemplo:

  1. Jugador 1 se conecta: cantidad jugadores: 1

  2. Jugador 2 se conecta: en la ventana del jugador 1, se suma el contador += 1. Total jugadores en la ventana 1: 2. Total jugadores en la ventana del jugador 2: 1.

Lo que sucede es que solamente el primer jugador en ingresar a la sala de espera va a ser el que llegue a la cantidad de jugadores igual a 4 primero, ya que el comienza desde el principio. Como las ventanas de los otros jugadores no cuentan a los jugadores que habían antes, siempre parten de 0. Por lo tanto, nunca se les va a activar la sala de juego al mismo tiempo.

Espero que se haya entendido el error, y mucho éxito con la tarea! :smile: