Manadar muchos objetos por socket

Buenas noches gente, tengo problemas al mandar objetos al un servidor que me gustaría me ayudaran a resolverlo. Tengo una clase "Datos" que tiene atributos que me interesan manejarlos en el servidor para generar algunas estadisticas, Cada vez que sucede algo que le ineresa al servidor se crea una nuevo objeto de tipo "Dato" y se guarda en un arraylist cuando el servidor necesita los datos le dice a los clientes que le manden la informacion, lo hago de la siguiente forma:

 

Me manda un nullPointerException en este bloque.
 

Espero me puedan entender.Lo mas seguro es que la forma en que lo estoy haciendo nos es la adecuada, ¿Alguno de ustedes me podria ayudar con un poco de lo logica o codigo? Gracias de antemano. =)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Cid

Y el Stacktrace ?

Seria conveniente ver tu clase completa, así como el Stacktrace para determinar donde esta la falla, sin embargo puede ser que el metodo readObject() es el que te este enviando el NullPointerException si es que no logra leer el objeto. Y tu còdigo tiene una llave que no se que hace ahi ?
 
Imagen de paranoid_android

Podrías

Intenta buscar algún caracter extraño, podrias buscar tramas que esta enviando y que no esta recibiendo para ver cual genera un error.

Imagen de n00b

solo copie las partes del

solo copie las partes del código donde creo esta el error y se me fue por ahí una llave, solo mostré los case que me están fallando por eso me salte al 5 disculpen si eso causo confución(debí preverlo una disculpa). Pondre las clases completas espero esto ayude un poco mas unque se que han dicho que no es muy recomendable hacerlo.

Este es el hilo que maneja a los clientes en el servidor, se crea uno cada vez que un cliente se conecta.

 

Este es el hilo que maneja al cliente.

 

Asi les digo a los clientes que me manden la información

 

Espero no se ofendan por la cantidad de lineas(aunque se que tampoco son muchas). La clase Detalle_fallas implementa la interfaz serializable solo para aclarar.

Imagen de Cid

Posibles errores

Hola bueno sigue un poco escueto porque no se que pase con tus clases Principal.DetalleFallas pero segun estas serializando y mandando esos datos ahi por lo que cuentas si cumple con implementar Serializable, entonces no hay problema, la falla entonces se puede deber a:

Si es el case 4:

el metodo readUTF() no este leyendo nada.

Si es el caso 5:

Aqui puede ser que el metodo obtenerDatos() no este devolviendo el arreglo.

Imagen de n00b

Aclaremos

Detalle_fallas es una clase que tiene atributos de tipo String y enteros, cada vez que el usuario falla al elegir una opcion se guardan detalles de esa falla como el nombre de la falla y cual es la opcion correcta, esto se guarda en un ArrayList de tipo Detalle_fallas(ArrayList), es decir se equivoca el usuario, se crea un objeto de la clase Detalle_fallas y se guarda en una lista de tipo Detalle_fallas. Quiero mandar esa lista al servidor para mostrar algunas estadisticas y graficarlas.Con el case 4 no hay problemas y el metodo obtenerDatos() si funciona, es decir si se manda ese arreglo de datos al servidor, lo que no se manda es la lista de objetos Principal.lstFallas, en concreto el siguiente bloque del case 5:

 

El servidor deberia de recibirlos de la siguiente forma en el case 4:

 

Pero no lo hace -_- me manda un nullPointerException al intentar añadir el objeto a la lista(det.add(obj). No se si tenga algo que ver la concurrencia a la hora en que los clientes mandan datos al servidor, aunque segun tengo entendido que los metodos readObject, readInt, readUTF, etc. Bloquean el hilo hasta que entre otro dato, espero no haberles liado un poco mas -_-.

Imagen de paranoid_android

Ya pudiste reproducir el error

¿Ya conseguiste enviar datos que generan el mismo error?

Imagen de n00b

Al parecer tendre que

Al parecer tendre que intentarlo de una forma diferente.Mandare todos los datos en un arreglo(de la forma que si me funciona), estuve pensando que de alguna forma tengo que avisarle al servidor que ya mande todos los datos que me pidio, entonces el servidor mandara la peticion a otro cliente y asi sucesivamente con todos los clientes(que es lo que debi haber hecho desde el principio). Gracias a todos por sus respuestas :)

No pusiste el stacktrace,

No pusiste el stacktrace, pero si el error está en la sección que dices solo puede ser que el arreglo :"det" ( supongo que por detalle ) no está inicializado.

Mira:

 
Si det ( mejor nombralo "detalleFallas", los discos de hoy en día tienen varios gigas de espacio ) es nulo , estás invocando   y eso resulta en NullPointerException.

Inicializalo e intenta de nuevo.

Muy bien por poner el código ( vaya.. así es más fácil que simplemente adivinar ) ahora el siguiente paso es que hagas un esfuerzo extra por hacerlo legible. A tu compilador no le importa nada, pero para los que lo leemos de este lado nos cuesta.

Espero que eso te ayude. Le voy a dar una formateada el código para que veas a que me refiero.

Saludos.

No estaba tan mal :)package

No estaba tan mal :)

 

Cada vez que anidas un if, dentro de otro if, dentro de otro... se hace un poquíto más dificil seguir el hilo. Agerga métodos auxiliares para que se vaya limpiando el codigo, tu run debería de verse así:

 

Cada método chiquito que se pone ahí te sirve incluso de documentación.

Ese es un ejemplo de como ditribuir el código para que sea más legible.

Espero que te sea de ayuda.

Saludos

Imagen de n00b

Gracias por tus comentarios.

Gracias por tus comentarios. Se que me alejo mucho de las buenas practicas de programacion, te pondria de pretexto infinidad de cosas pero la verdad es por no leer un poco mas, ¿tendras algo de teoria para leer? nunca es tarde para comenzar jeje :P

Si, y no es regaño ni nada,

Si, y no es regaño ni nada, es ayuda.

Para leer empieza pro esto:

:)

Imagen de n00b

Comprendo, corregiré lo que

Comprendo, corregiré lo que me indicaste y te cuento que pasa. Tal vez abuso de tu confianza pero me podrias ayudar con el requerimiento que comente hace un rato.

"estuve pensando que de alguna forma desde el cliente tengo que avisarle al servidor que ya mande todos los datos que me pidio, entonces el servidor mandara la peticion a otro cliente y asi sucesivamente con todos los clientes activos(que es lo que debi haber hecho desde el principio)".

Tal vez no sea posible con codigo, pero algo de logica me basta. Gracias de antemano. :)

Como diría un amigo, me fui

Como diría un amigo, me fui por la fácil y solo revisé tu código ya no ví ni que hace o cual es el diseño detrás así que no podría opinar, pero te puedo dar una idea.

Como funciona por ejemplo el modelo HTTP es que el cliente le pide datos al servidor y este le devuelve los datosy se cierra la conexión. Al pedirselo también puede mandas datos.

Podías hacer algo similar, hacer que el cliente se conecte al servidor y le mande su estatus. El servidor lo atiende y le responde el estatus de los demas jugadores ( que tiene almacenado en algún lado )

Algo así: ( pseudo-código: nombrevariable TipoDato )
 

Bueno algo así es la idea.

Este es solo un modelo en el que cada cliente le envía el servidor cada cierto tiempo su estatus, el servidor lo que hace es que lo almacena y se lo pasa al siguiente que se conecte. También puede aplicar reglas del juego.

Otra forma es teniendo una conexión permanente y estar empujando la información o jalandola. Otro ( que me parece es el que hiciste ) es teniendo dos canales abiertos, uno para leer y otro para escribir, ahí la comunicación es asíncrona, puedes estar escribiendo y de repente el server te escribe, un tanto más compleja.

En fin, espero que le entiendas al pseudo código

Saludos.

Imagen de n00b

Gracias por tus respuestas,

Gracias por tus respuestas, me guiare de tu pseudo código.

saludos.