Autor
|
Tema: Error tonto con threads y sockets (Leído 12,218 veces)
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
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
|
|
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
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; }
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
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; }
Me da un nuevo problema... y no entiendo porque :s 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: public void ServidorChat() { try { while (true) { System. out. println("Esperando conexiones..."); Socket cliente = socketServidor. accept(); contador++; System. out. println("Bienvenid@ cliente numero " + contador + ".\n"); Runnable nuevoCliente = new ThreadServidor (cliente ); hilo.start(); System. out. println("Te hemos asignado el thread: " + hilo + ".\n"); vextorClientes.put(contador, socket); } { e.printStackTrace(); } }
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
|
|
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
en fragmento no veo nada malo 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
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
en fragmento no veo nada malo 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.NullPointerExceptionTe 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: public static Hashtable <Integer,Socket > vectorClientes = new Hashtable();
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
|
|
« Última modificación: 27 Diciembre 2009, 21:56 pm por ,.-~*´¨¯¨`*·~-.¸..::| D3Bć1 |::.,.-~*´¨¯¨`*·~-.¸ »
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
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/?3t3jhjxu2ozSaludos.
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
Gracias lo ojeare como curiosidad, pero esto es algo que quiero hacerlo yo solo xD Bueno, usando vuestra ayuda pero salir de los aprietos con mi propio codigo. Saludos
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
Otro problema extraño, he construido el bucle para leer todos los sockets y escribirlos en flujo uno a uno , lo he hecho asi: public void run() { try { while(acabado){ String mensajeRecivido = dataInput. readUTF(); System. out. println(mensajeRecivido ); //dataOutput.writeUTF(mensajeRecivido); System. out. println("Hay " + Servidor. vectorClientes. size() + " conectados.\n"); for(int i = 0; i < Servidor.vectorClientes.size(); i++) { Socket socketVolatil = Servidor. vectorClientes. get(i ); dosVolatil.writeUTF(mensajeRecivido); } System. out. println("Mi id es: " + quienSoy ); } System. out. println("Adios cliente " + quienSoy + "\n"); Servidor.contador--; }
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: Exception in thread "Thread-1" java.lang.NullPointerException at threads.ThreadServidor.run(ThreadServidor.java:64) at java.lang.Thread.run(Thread.java:619)
|
|
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
claro que da error el hastTable esta definido por keys mas no indices enteros para recorrerlo es asi Hashtable<Integer, String> hash = new Hashtable<Integer, String>(); Enumeration<String> elemets = hash.elements(); while(elemets.hasMoreElements()){ elemets.nextElement(); }
Saludos.
|
|
|
En línea
|
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
claro que da error el hastTable esta definido por keys mas no indices enteros para recorrerlo es asi Hashtable<Integer, String> hash = new Hashtable<Integer, String>(); Enumeration<String> elemets = hash.elements(); while(elemets.hasMoreElements()){ elemets.nextElement(); }
Saludos. le pedia indice 0 y el mas pequeño era 1 xDDD 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
|
|
« Última modificación: 27 Diciembre 2009, 22:49 pm por ,.-~*´¨¯¨`*·~-.¸..::| D3Bć1 |::.,.-~*´¨¯¨`*·~-.¸ »
|
En línea
|
|
|
|
|
|