在Java中断开Socket连接

6

你好,我正在构建一个小型的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();
    }

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

你有没有想过,如果任何一个close()语句抛出异常会发生什么? - luis.espinal
3个回答

11

Socket.close()的JavaDoc清楚地说明:

关闭此套接字将同时关闭套接字的InputStream和OutputStream。

这将抛出异常,因为您已经关闭了它们!


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

0
在关闭输出流之前执行 flush 操作是否是正确的做法?
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接