Problema lógico... [Otro mas..] (pero que cabezota que soy...)

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

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

Debci

Cita de: Novlucker en 31 Diciembre 2009, 13:05 PM
Ok, lo que ocurre es que mi sugerencia venía de parte de C# por ejemplo (la similitud con Java es monstruosa!), donde si bien las hashtables no pueden tener keys null, si pueden tener valores null, pero ahora revisando la documentación de java ...

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Citarput
public Object put(Object key,
Object value)

Maps the specified key to the specified value in this hashtable. Neither the key nor the value can be null.

Entonces hay que descartar esa opción.

Alternativa que se me ocurre, llevar un simple array de booleanos en paralelo, donde index +1 = ID y valor true o false según este o no conectado.

Entonces al igual que antes recorres el array, si el elemento 0 es false (por ej), entonces el ID1 esta vacío, cambias valor a true, y en la hashtable asignas objeto :P

Por otra parte, no hay método para cambiar tamaño de array luego de declarado? :o (obviamente no me refiero a copiar el array en otro con length+1)

Saludos

Para hacerlo de esa manera, mejor usar hashTable jeje, mira voy a intentar algo asi:

HashTable<Integer, Integer> listanegra;

Si se desconecta un cliente, se añade a la lista negra y añade la key por orden, y el otro valor el id que deja libre, luego en cada asignacion de id, recorro la hashTable y cojo los valores libres que van quedando disponibles.

En teoria funcionaria no?


Pero se me presenta una duda, como hago para cojer siempre el valor libre mas pequeño?

Saludos

Novlucker

No creo que sea mejor usar un hashtable, para lo que planteo tendrías una simple lista, para lo que comentas tendrías una tabla que además no se aprovecha, y con eso voy a lo siguiente que preguntas ...

CitarSi se desconecta un cliente, se añade a la lista negra y añade la key por orden, y el otro valor el id que deja libre, luego en cada asignacion de id, recorro la hashTable y cojo los valores libres que van quedando disponibles.
Para eso deberías de recorrer todas las claves de la hashtable (blacklist) para así determinar cual es la más pequeña ..

Mín = Primer elemento
Segundo elemento menor que Mín?
Si - Mín = Segundo elemento
No - Siguiente

O por "fuerza bruta", revisando si una key esta en la hashtable hasta encontrar la primera coincidencia o haber comparado N elementos == Hashtable.size.

No lo veo más sencillo :P

Saludos

P.D: creo que ya he publicado más post de los debidos en este subforo XD
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Debci

Nada que no sale, lo he intentado con un array y ahora con hashTable y nada:

Metodo de busqueda antes de asignar
Código (java) [Seleccionar]

while (true)
            {
            try {
                   
                System.out.println("Esperando conexiones...");

                Socket zombie = socketServidor.accept();
                idZombie++;
                for(int i = 1; i < listaNegra.size(); i++)
                {
                    System.out.println(listaNegra.get(i));
                }
                if(listaNegra.isEmpty())
                {
               
               
                System.out.println("Nuevo zombie añadido a la BotNet: " + idZombie + "\n");
                vectorZombies.put(idZombie, zombie);
                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!", idZombie);
                }else if(borrado)
                {
                System.out.println("Asignando un id disponible...\n");
                System.out.println("Nuevo zombie añadido a la BotNet: " + listaNegra.get(contador) + "\n");
                vectorZombies.put(listaNegra.get(contador), zombie);
                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!",listaNegra.get(contador));
                }else{
                System.out.println("Nuevo zombie añadido a la BotNet: " + idZombie + "\n");
                vectorZombies.put(idZombie, zombie);
                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!", idZombie);
                }
   
               
               
                nuevoZombie.start();
                Servidor.slider.setMaximum(idZombie);
                Servidor.numBots.setText(idZombie.toString());
                borrado = false;
               
               
            } catch (IOException ex) {
                Logger.getLogger(ThreadEjecución.class.getName()).log(Level.SEVERE, null, ex);
            }


            }


Metodo que uso cuando un cliente se desconecta:

Código (java) [Seleccionar]

System.out.println("ADIOS!");
            contador++;
            ThreadEjecución.listaNegra.put(contador, id);
           
            ThreadEjecución.RenovarDatos();
           
            ThreadEjecución.borrado = true;


Y todo bien, creo nuevos clientes, los tira adelante, pero cuando borro uno, y intento crear otro:

Exception in thread "Thread-1" java.lang.NullPointerException


Porqueeeeeee

Saludos

Leyer

#13

Cita de: Novlucker en 31 Diciembre 2009, 14:28 PM
P.D: creo que ya he publicado más post de los debidos en este subforo XD
:)

y asi  bueno ya probaste utilizar un vector<usuario> vector <usuario>(); es decir que la ID estara interna al obj usuario es decir usuario.getID(); la cual puedes optenerla como la IP del usuario o alguna otra ID que le asignes y bueno cuando se desconecte uno solo seria  Server.vector.remove(this); este estara en el obj usuario asi que cuando agas "this" eliminara ese usuario del vector y asi no te daria problemas es seguro  
Código (java) [Seleccionar]

while(true){
try {
    connector = serverConnector.accept();
    userConnected = new ThreadUserConnected(this,connector);
    System.out.println("> Nuevo usuario conectado IP: "+connector.getInetAddress()+" L: "+connector.getLocalPort());
    vectorOfConnectedUsers.addElement(userConnected);
    try {
Thread.sleep(200);
} catch (InterruptedException e) {System.err.println(e);System.exit(0);}
    vectorOfConnectedUsers.get(user).sendMessage(content.Constant._SERVERNAME,"Estas Conectado! ",Constant._SERVERFONT,Constant._SERVERSTYLE,Constant._SERVERCOLOR);
    user++;
} catch (IOException e) {System.err.println(e);
System.exit(0);
} catch (Exception e) {
content.Util.showException(this.getClass().getName(), "Error",e.toString());
}
}

Debci

Ese vector no es mas que una lista negra donde voy metiendo los que se desconectan, meto un id sumatoria (1,2,3,4,5...) como key y el otro valor integer el id que queda libre para asignarle a otro.


Saludos