Error tonto con threads y sockets

Iniciado por Debci, 26 Diciembre 2009, 15:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Debci

Cita de: 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
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

Leyer

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;
}

Debci

Cita de: 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;
}
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:

Código (java) [Seleccionar]

public void ServidorChat()
   {
       try
       {
           ServerSocket socketServidor = new ServerSocket(5558);
           
           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);
               Thread hilo = new Thread(nuevoCliente);
               hilo.start();
               System.out.println("Te hemos asignado el thread: " + hilo + ".\n");
               vextorClientes.put(contador, socket);
               
               
           }
       } catch (Exception e)
       {
           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

Leyer

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

Debci

#14
Cita de: 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
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 (java) [Seleccionar]

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

Leyer

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.

Debci

Cita de: 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.
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

Debci

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 (java) [Seleccionar]

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 = new DataOutputStream(socketVolatil.getOutputStream());
                dosVolatil.writeUTF(mensajeRecivido);
            }
            System.out.println("Mi id es: " + quienSoy);
           
          }
           
        } catch (IOException ex) {
           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:

CitarException in thread "Thread-1" java.lang.NullPointerException
        at threads.ThreadServidor.run(ThreadServidor.java:64)
        at java.lang.Thread.run(Thread.java:619)

Leyer

claro que da error el hastTable esta definido por keys mas no indices enteros para recorrerlo es asi
Código (java) [Seleccionar]

Hashtable<Integer, String> hash = new Hashtable<Integer, String>();
    Enumeration<String> elemets = hash.elements();
    while(elemets.hasMoreElements()){
    elemets.nextElement();
    }

Saludos.

Debci

#19
Cita de: 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 (java) [Seleccionar]

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