2011-04-26 27 views
5

Hola estoy construyendo un pequeño programa p2p, implementando tanto el lado del servidor como el lado del cliente. cuando almorzo el programa del lado del cliente, primero creo que lo hace es conectarse a cada servidor en su lista, enviar datos (sobre el lado del cliente) y desconectarse. La próxima vez que el lado del cliente se conecte a uno de estos servidores, será reconocido.desconectándose de un socket en java

Mi problema - cuando te digo el lado del cliente para desconectar, me sale esta excepción

java.io.EOFException 
at java.io.DataInputStream.readUnsignedShort(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 
at oop.ex3.nameserver.NameServerThread.run(NameServerThread.java:24) 

para desconectar que acabo de escribir:

finally { 
     out.close(); 
     in.close(); 
     socket.close(); 
    } 

es así, ¿cómo puedo evitar esta excepción? ¡Gracias!

+0

Uhh, ¿has pensado en lo que pasaría si alguno de los 'individuo cerca (a)' declaraciones lanzar una excepción ? –

Respuesta

10

el Javadoc para Socket.close() indica claramente:

Cerrando esta toma también se cerrará de la toma de InputStream y OutputStream .

que emitirá la excepción ya que usted ya los ha cerrado!

0

Cuando cierra el lado del cliente, ¿qué esperaría que ocurriera en el servidor?

Para evitar esta excepción, debe implementar su propio método readUnsignedShort().

public int readUnsignedShort() { 
    int ch1 = in.read(); 
    int ch2 = in.read(); 
    if ((ch1 | ch2) < 0) 
//  don't throw new EOFException(); 
     return -1; // EOF marker. 

    return (ch1 << 8) + (ch2 << 0); 
} 
0

sería correcto hacer un rubor antes de cerrar los flujos de salida ?:

finally { 
    //this is the DataOutputStream 
    if(dout != null){ 
     dout.flush(); 
     dout.close(); 
    } 
    //and this the OutputStream 
    if(out != null){ 
     out.flush(); 
     out.close(); 
    } 
    if (din != null){ 
     din.close(); 
    } 
    if (in != null){ 
     in.close(); 
    } 
    if (socket != null){ 
     socket.close(); 
    } 
} 
Cuestiones relacionadas