断开与java中的套接字

时间:2011-04-26 16:53:35

标签: java sockets

您好 我正在构建一个小的p2p程序,实现服务器端和客户端。 当我在客户端程序中吃午餐时,首先想到的是连接到列表中的每个服务器,发送数据(关于客户端)并断开连接。下次客户端连接到其中一个服务器时,它将被识别。

我的问题 - 当我告诉客户端断开连接时,我得到了这个异常

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)

断开我刚刚写道:

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

所以,我该如何避免这种异常?谢谢!

3 个答案:

答案 0 :(得分:10)

Socket.close()的JavaDoc明确指出:

  

关闭此套接字也将关闭   套接字的InputStream和   输出流。

会抛出异常,因为你已经关闭它们了!

答案 1 :(得分:0)

当您关闭客户端时,您希望在服务器端发生什么?

要避免此异常,您需要实现自己的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);
}

答案 2 :(得分:0)

在关闭输出流之前是否正确执行刷新?:

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();
    }
}