elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Problema lógico... [Otro mas..] (pero que cabezota que soy...)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Problema lógico... [Otro mas..] (pero que cabezota que soy...)  (Leído 5,302 veces)
Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Problema lógico... [Otro mas..] (pero que cabezota que soy...)
« Respuesta #10 en: 31 Diciembre 2009, 14: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
Citar
put
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


En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Problema lógico... [Otro mas..] (pero que cabezota que soy...)
« Respuesta #11 en: 31 Diciembre 2009, 14:28 pm »

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 ...

Citar
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.
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


En línea

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
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Problema lógico... [Otro mas..] (pero que cabezota que soy...)
« Respuesta #12 en: 31 Diciembre 2009, 15:31 pm »

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

Metodo de busqueda antes de asignar
Código
  1. while (true)
  2.            {
  3.            try {
  4.  
  5.                System.out.println("Esperando conexiones...");
  6.  
  7.                Socket zombie = socketServidor.accept();
  8.                idZombie++;
  9.                for(int i = 1; i < listaNegra.size(); i++)
  10.                {
  11.                    System.out.println(listaNegra.get(i));
  12.                }
  13.                if(listaNegra.isEmpty())
  14.                {
  15.  
  16.  
  17.                System.out.println("Nuevo zombie añadido a la BotNet: " + idZombie + "\n");
  18.                vectorZombies.put(idZombie, zombie);
  19.                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!", idZombie);
  20.                }else if(borrado)
  21.                {
  22.                System.out.println("Asignando un id disponible...\n");
  23.                System.out.println("Nuevo zombie añadido a la BotNet: " + listaNegra.get(contador) + "\n");
  24.                vectorZombies.put(listaNegra.get(contador), zombie);
  25.                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!",listaNegra.get(contador));
  26.                }else{
  27.                System.out.println("Nuevo zombie añadido a la BotNet: " + idZombie + "\n");
  28.                vectorZombies.put(idZombie, zombie);
  29.                nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!", idZombie);
  30.                }
  31.  
  32.  
  33.  
  34.                nuevoZombie.start();
  35.                Servidor.slider.setMaximum(idZombie);
  36.                Servidor.numBots.setText(idZombie.toString());
  37.                borrado = false;
  38.  
  39.  
  40.            } catch (IOException ex) {
  41.                Logger.getLogger(ThreadEjecución.class.getName()).log(Level.SEVERE, null, ex);
  42.            }
  43.  
  44.  
  45.            }
  46.  

Metodo que uso cuando un cliente se desconecta:

Código
  1. System.out.println("ADIOS!");
  2.            contador++;
  3.            ThreadEjecución.listaNegra.put(contador, id);
  4.  
  5.            ThreadEjecución.RenovarDatos();
  6.  
  7.            ThreadEjecución.borrado = true;
  8.  

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
En línea

Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Problema lógico... [Otro mas..] (pero que cabezota que soy...)
« Respuesta #13 en: 31 Diciembre 2009, 19:00 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
  1. while(true){
  2. try {
  3.     connector = serverConnector.accept();
  4.     userConnected = new ThreadUserConnected(this,connector);
  5.     System.out.println("> Nuevo usuario conectado IP: "+connector.getInetAddress()+" L: "+connector.getLocalPort());
  6.     vectorOfConnectedUsers.addElement(userConnected);
  7.     try {
  8. Thread.sleep(200);
  9. } catch (InterruptedException e) {System.err.println(e);System.exit(0);}
  10.     vectorOfConnectedUsers.get(user).sendMessage(content.Constant._SERVERNAME,"Estas Conectado! ",Constant._SERVERFONT,Constant._SERVERSTYLE,Constant._SERVERCOLOR);
  11.     user++;
  12. } catch (IOException e) {System.err.println(e);
  13. System.exit(0);
  14. } catch (Exception e) {
  15. content.Util.showException(this.getClass().getName(), "Error",e.toString());
  16. }
  17. }
« Última modificación: 31 Diciembre 2009, 19:02 pm por LEYER » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Problema lógico... [Otro mas..] (pero que cabezota que soy...)
« Respuesta #14 en: 1 Enero 2010, 14:08 pm »

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
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Me duele el ojo, veo borroso (operado de cataratas de un ojo) pero el otro...
Foro Libre
win_7 7 3,796 Último mensaje 4 Octubre 2021, 02:51 am
por El_Andaluz
Operador lógico OR
Programación C/C++
OlgaFuentes 1 2,793 Último mensaje 6 Octubre 2022, 18:24 pm
por Lieutenant McFarley
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines