Mirad estoy constryendo una aplicacion con sockets, que gestiona varios cliente mediante el uso de threads, la cosa esta en que cada vez que se conecta un cliente al servidor, este le abre un thread, y lo deja en ejecucion hasta que el cliente se cierra y le envia un binario, cuando le envia el binario se cumple el bucle y el thread muere, pero ocurre una cosa extraña, mirad el codigo:
ClienteGui.java
Código
package sockets; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author debci */ /** Creates new form ClienteGui */ public ClienteGui() { 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() { formWindowClosed(evt); } formWindowClosing(evt); } }); jButton1.setText("Enviar"); jButton1ActionPerformed(evt); } }); textoEnv.setColumns(20); textoEnv.setRows(5); jScrollPane1.setViewportView(textoEnv); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jButton1) .addContainerGap()) .addGroup(layout.createSequentialGroup() .addGap(21, 21, 21) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(83, 83, 83) .addComponent(jButton1) .addContainerGap()) ); pack(); }// </editor-fold> try { dos.writeBoolean(true); dos.writeUTF(cadena); Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex); } } } try { dos.writeBoolean(false); Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex); } } /** * @param args the command line arguments */ public void run() { try { new ClienteGui().setVisible(true); is = socket.getInputStream(); os = socket.getOutputStream(); Logger.getLogger(ClienteGui.class.getName()).log(Level.SEVERE, null, ex); } } }); } // Variables declaration - do not modify // End of variables declaration }
Servidor.java
Código
package sockets; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import threads.ThreadServidor; /** * * @author debci */ public class Servidor { Servidor servidor = new Servidor(); servidor.ServidorChat(); } public void ServidorChat() { try { while (true) { hilo.start(); } { e.printStackTrace(); } } }
ThreadServidor.java
Código
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; /** * * @author debci */ //Socket al que esta conectado el cliente /** Para lectura de datos en el socket */ /** Para escritura de datos en el socket */ private boolean acabado = true; try { socket1 = socket; } } public void run() { try { while(acabado){ acabado = dataInput.readBoolean(); } Logger.getLogger(ThreadServidor.class.getName()).log(Level.SEVERE, null, ex); }
Me explico, la cosa esta en que cuando el cliente, se cierra (formClosing) se envia el booleano al thread que lo esta atendiendo.
Si el booleano se cambia, se rompe el bucle while y se muere el thread.
El problema, y no se de donde viene, es que cuando cierro un cliente y le pido desconexion y que mate al thread, el servidor libera un error:
Código:
26-dic-2009 15:30:55 threads.ThreadServidor run
GRAVE: null
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323)
at java.io.DataInputStream.readUTF(DataInputStream.java:572)
at java.io.DataInputStream.readUTF(DataInputStream.java:547)
at threads.ThreadServidor.run(ThreadServidor.java:50)
at java.lang.Thread.run(Thread.java:619)
Saludos y gracias a todos.