Título: Error tonto con threads y sockets Publicado por: Debci en 26 Diciembre 2009, 15:39 pm Hola a todos jeje, soy yo otra vez, he vuelto al java xD
Mirad estoy constryendo una aplicacion con sockets, que gestiona varios cliente mediante el uso de threads, la cosa esta en que cada vez que se conecta un cliente al servidor, este le abre un thread, y lo deja en ejecucion hasta que el cliente se cierra y le envia un binario, cuando le envia el binario se cumple el bucle y el thread muere, pero ocurre una cosa extraña, mirad el codigo: ClienteGui.java Código
Servidor.java Código
ThreadServidor.java Código
Me explico, la cosa esta en que cuando el cliente, se cierra (formClosing) se envia el booleano al thread que lo esta atendiendo. Si el booleano se cambia, se rompe el bucle while y se muere el thread. El problema, y no se de donde viene, es que cuando cierro un cliente y le pido desconexion y que mate al thread, el servidor libera un error: Código: 26-dic-2009 15:30:55 threads.ThreadServidor run Saludos y gracias a todos. Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 26 Diciembre 2009, 23:34 pm :P si es verdad es un error tonto. te da ese error por que no estas haciendo la comprobacion del cierre de conexion en el hilo usuario que estas creando en tu caso es ThreadServidor..
Saludos! Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 15:00 pm :P si es verdad es un error tonto. te da ese error por que no estas haciendo la comprobacion del cierre de conexion en el hilo usuario que estas creando en tu caso es ThreadServidor.. Mmm comprovacion? a que te refieres, algun tipo de ping?Saludos! Saludos Título: Re: Error tonto con threads y sockets Publicado por: panaka en 27 Diciembre 2009, 16:45 pm Supongo que se referirar a que cuando intentas utilizar una conexion que has cerrado no has comprobado si efectivametne dicha coenxion esta bind, prueba.isConected(), .isBound()
Saludos Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 17:06 pm Gracias a todos, resuelto ^^
Para no abrir otro post, preguinto aqui mi nueva duda: Como puedo hacer para que todo lo que envien todos los clientes, el servidor lo envie a todos, es decir, lo que un cliente envia a su thread en el servidor, el thread lo mande a los demas clientes, una sala de chat por asi decirlo, es que mi logica no llega a mas, no veo de que manera podria hacerlo. Saludos y gracias a todos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 18:35 pm muy facil tienes que hacer un vector o HasTable( lo recomiendo) donde almacenaras los hilos de los usuarios por su IP u otra referencia que puedas usar es decir HasTable.put("127.0.0.1",usuario); donde usuario es el objeto de hilo usuario que creas por cada conexion entrante al servidor ..entonces cuando llega un mensaje el servidor solo tienes que leer todos los usuarios y eviarle el mensaje recibido a todos..ya que cada uno tendra su metodo de lectura y escritura (In/Out);) tambien sirve para mensajes privados solo hay que usar un poco mas la logica :) espero te de la idea .asi lo ise en mi Jchat :D
Saludos Edit: Sobre lo anterior. Yo me referia a que en el servidor no estabas creando la comprobacion del cierre es decir que cuando el cliente enviaba el boolean para cerrar..daba error en el hilo usuario del servidor por que no estaba la accion de dicha accion de cierre. if(!acabado) break; Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 19:01 pm muy facil tienes que hacer un vector o HasTable( lo recomiendo) donde almacenaras los hilos de los usuarios por su IP u otra referencia que puedas usar es decir HasTable.put("127.0.0.1",usuario); donde usuario es el objeto de hilo usuario que creas por cada conexion entrante al servidor ..entonces cuando llega un mensaje el servidor solo tienes que leer todos los usuarios y eviarle el mensaje recibido a todos..ya que cada uno tendra su metodo de lectura y escritura (In/Out);) tambien sirve para mensajes privados solo hay que usar un poco mas la logica :) espero te de la idea .asi lo ise en mi Jchat :D Mira yo he pensado lo siguiente, a cada user una id, y a partir de esto le asigno un hilo a cada uno, pero se me plantea una duda, si meto la id con el hilo en la hashtable como escribo los streams solo con e hilo alamacenado?Saludos Edit: Sobre lo anterior. Yo me referia a que en el servidor no estabas creando la comprobacion del cierre es decir que cuando el cliente enviaba el boolean para cerrar..daba error en el hilo usuario del servidor por que no estaba la accion de dicha accion de cierre. if(!acabado) break; Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 19:11 pm bueno el obj usuario oviamente tienes que pasarle el socket solo tienes que hacer en el obj o hilo usuario los stream in/out la entrada puedes hacerla en el metodo run del obj usuario para recibir. creo que te refieres a eso..
Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 20:02 pm bueno el obj usuario oviamente tienes que pasarle el socket solo tienes que hacer en el obj o hilo usuario los stream in/out la entrada puedes hacerla en el metodo run del obj usuario para recibir. creo que te refieres a eso.. Vale, mira, haber si me lo planteo:Algoritmo: Server escucha Cliente activo [1] Servidor Guarda en hashTable Cliente activo [2] Servidor guarda en HashTable Cliente[1] escribe streamSocket Servidor lee en el thread de ese cliente, y lo envia al bucle del servidor. Servidor recorre hashTable (todos los indices) y saca uno a uno los sockets de estos para escribir el stream Todos los cliente lo reciven. Seria asi? Buff y eso aguantar el servidor? Que duro... y poderoso el lenguaje Java... Bestial Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 20:09 pm no saca los socket solo llama al metodo escritura y pues si es correpto el servidor funcionara bien ya lo veras
Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 20:19 pm no saca los socket solo llama al metodo escritura y pues si es correpto el servidor funcionara bien ya lo veras llamo al metodo de escritura sobre la hashTable? pero no deberia hacer lo siguiente:for(int i = 0;length de hashtable; i++){ Socket socketVolatil = hashTable.getKey(o parecido) socketVolatil.writeUtf(datosrecividosdeuncliente); } NO? Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 20:26 pm tambien funciona pero mi recomendacion es que los hilos en si tengan su entrada y salida interna seria
hashTable.getKey(ID).metodoDeEscritura("texto"); class usuario extends Therad{ public void write(String text){ ...... } } class servidor { .... socket.acept(): Usuario usuario = new Usuario(socket); HastTable.put("ID",usuario); usuario.start; } Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 20:46 pm tambien funciona pero mi recomendacion es que los hilos en si tengan su entrada y salida interna seria Me da un nuevo problema... y no entiendo porque :shashTable.getKey(ID).metodoDeEscritura("texto"); class usuario extends Therad{ public void write(String text){ ...... } } class servidor { .... socket.acept(): Usuario usuario = new Usuario(socket); HastTable.put("ID",usuario); usuario.start; } Mira te lo enseño: Cuando el servidor recive una nueva conexion, por tanto un nuevo cliente aumenta el contador de clientes, cuando este se va disminuye en uno el contador, asi que uso esas keys para identificarlos en la hashTable: Código Y ahi em da error al ejecutar, es decir, cuando recivo una nueva conexion y guardo los datos del cliente en el vector (HashTable), me da el siguiente error: Esperando conexiones... java.lang.NullPointerException Bienvenid@ cliente numero 1. at threads.ThreadServidor.<init>(ThreadServidor.java:41) at sockets.Servidor.ServidorChat(Servidor.java:41) at sockets.Servidor.main(Servidor.java:23) En la linea que marca error tengo el HashTable que reocje el socket y la clave. Porque? no lo se... Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 21:16 pm en fragmento no veo nada malo :P a no ser que el hastTable no este definido HastTable<Integer,Socket> tambien creo que tu ThreadServidor era Thread y lo estas pasando a runable para luego a Thread eso no es bueno. por lo demas no veo el error en ese fragmento
Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 21:47 pm en fragmento no veo nada malo :P a no ser que el hastTable no este definido HastTable<Integer,Socket> tambien creo que tu ThreadServidor era Thread y lo estas pasando a runable para luego a Thread eso no es bueno. por lo demas no veo el error en ese fragmento osea que el paso a runable lo puedo quitar y ejecutar directamente el thread?Edito: Ahora he declarado la hastable como me has dicho y hay otro error: Esperando conexiones... Bienvenid@ cliente numero 1. java.lang.NullPointerException Te hemos asignado el thread: Thread[Thread-1,5,main]. at sockets.Servidor.ServidorChat(Servidor.java:45) at sockets.Servidor.main(Servidor.java:23) Adios cliente 1 No veo porque ocurre pero weno... Saludos EDITO: Solucionado, hacia falta instanciar el obejto mediante el operador new: Código Ahoraaa si, voy a probar con el metodo que me dijiste. Me parece increible que se peuda automatizar una tarea tan compleja, crear microprocesos para cada cliente y que etsen activos todo el rato atendiendo a sus clientes, que se recorran las listas de clientes y se envien datos... Cada vez es mas flipante. Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 21:52 pm claro ya que TheadServidor ya extends de Thread. por cierto de dejo el code de mi jchat estoy seguro de que de algo te servira ;)
http://www.mediafire.com/?3t3jhjxu2oz Saludos. Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 21:57 pm claro ya que TheadServidor ya extends de Thread. por cierto de dejo el code de mi jchat estoy seguro de que de algo te servira ;) Gracias lo ojeare como curiosidad, pero esto es algo que quiero hacerlo yo solo xDhttp://www.mediafire.com/?3t3jhjxu2oz Saludos. Bueno, usando vuestra ayuda pero salir de los aprietos con mi propio codigo. Saludos Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 22:30 pm Otro problema extraño, he construido el bucle para leer todos los sockets y escribirlos en flujo uno a uno , lo he hecho asi:
Código Y ahora al primer mensaje que envio con alguno de los clientes, me lo pone en el servidor pero no me lo refleja a mi pantalla, es decir a la de mi cliente, solo al servidor, y el proceso de este cliente se muere, activo otro cliente y pasa lo mismo. MIrad el error que da cuando envio algo: Citar Exception in thread "Thread-1" java.lang.NullPointerException at threads.ThreadServidor.run(ThreadServidor.java:64) at java.lang.Thread.run(Thread.java:619) Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 22:41 pm claro que da error el hastTable esta definido por keys mas no indices enteros para recorrerlo es asi
Código Saludos. Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 22:43 pm claro que da error el hastTable esta definido por keys mas no indices enteros para recorrerlo es asi le pedia indice 0 y el mas pequeño era 1 xDDDCódigo Saludos. Ahora un nuevo problema, la cosa concurre en lo siguiente: Cuando los dos clienets se conectan a la vez bien, se tramitan mensajes de coña y eso, pero si uno se conecta antes que otro la hemos jodido porque en el thread del otro no hay la conexion de los otros, y no envia a todos. EDITO: He investigado mas sobre el tema y ocurre lo siguiente: Creo nuevo cliente, envio mensaje, solo se ve a si mismo, es evidente, creo otro (ya van 2) y envio y se ve a los otros y a si mismo, pero a el no le llega lo del cliente 1. Es decir, que al ultimo no le llega nada, ni lo que el escribe ni lo que los demas escriben, como es eso? Saludos Título: Re: Error tonto con threads y sockets Publicado por: Debci en 27 Diciembre 2009, 22:56 pm Siento haberme precipitado otra vez xD
El problema residia en que aumentaba el contador del hashTable antes de tiempo, y solo atendia a los mas pequeños que el ultimo id, repuse a 0 y ya funciona todo, bien, perfecto, no error. Pooooooooor fiiiiiin!!!!!! Pronto pondre el code. Ademas este post es muy instructivo, se aprende mucho de el, muchas cosas. Saludos Título: Re: Error tonto con threads y sockets Publicado por: Leyer en 27 Diciembre 2009, 23:01 pm jaja tas igual que whk respondiendose el mismo jeje no me dejaste analizar :xD en fin se me hacia raro ese error por cierto "sistema servidor-cliente dinamico hiper ultra sodomizador" WTF.! :laugh:
Saludos. Título: Re: Error tonto con threads y sockets Publicado por: Debci en 28 Diciembre 2009, 10:20 am jaja tas igual que whk respondiendose el mismo jeje no me dejaste analizar :xD en fin se me hacia raro ese error por cierto "sistema servidor-cliente dinamico hiper ultra sodomizador" WTF.! :laugh: Sodomiza, te lo aseguro xDDSaludos. Saludos |