Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中断开与套接字的连接_Java_Sockets - Fatal编程技术网

在java中断开与套接字的连接

在java中断开与套接字的连接,java,sockets,Java,Sockets,嗨 我正在构建一个小型p2p程序,实现服务器端和客户端。 当我使用客户端程序时,首先想到的是连接到列表中的每台服务器,发送数据(关于客户端)并断开连接。下次客户端连接到其中一台服务器时,它将被识别 我的问题-当我告诉客户端断开连接时,我得到了这个异常 java.io.EOFException at java.io.DataInputStream.readUnsignedShort(Unknown Source) at java.io.DataInputStream.readUTF(Unknown

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

那么,我如何避免这个例外呢?谢谢

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

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


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

关闭客户端时,服务器端会发生什么

为了避免此异常,您需要实现自己的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);
}
public int readUnsignedShort(){
int ch1=in.read();
int ch2=in.read();
如果((ch1 | ch2)<0)
//不要抛出新的EOFEException();
return-1;//EOF标记。

return(ch1在关闭输出流之前进行刷新是否正确?:

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

嗯,你有没有想过如果任何一个
close()
语句抛出异常会发生什么?