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中确定服务器是否已关闭连接(接收到RST数据包)?_Java_Sockets_Tcp - Fatal编程技术网

如何在Java中确定服务器是否已关闭连接(接收到RST数据包)?

如何在Java中确定服务器是否已关闭连接(接收到RST数据包)?,java,sockets,tcp,Java,Sockets,Tcp,我正在使用套接字类进行TCP连接。但我目前的问题是确定确切的原因。 在这两种情况下(如果存在连接超时或服务器关闭连接),我都会收到带有“断管”消息的SocketException。那么我如何才能准确地确定断开连接的原因呢 谢谢 我认为应该抛出一个不同的异常。如果您正在谈论连接,那么您应该从主机获得一个SocketException,该主机发送一个重置(我认为这是RST数据包)和一个SocketTimeoutException,如果您的连接超时 如果您再次谈论IO,如果服务器断开连接,您将得到一个

我正在使用套接字类进行TCP连接。但我目前的问题是确定确切的原因。 在这两种情况下(如果存在连接超时或服务器关闭连接),我都会收到带有“断管”消息的SocketException。那么我如何才能准确地确定断开连接的原因呢


谢谢

我认为应该抛出一个不同的
异常。如果您正在谈论连接,那么您应该从主机获得一个
SocketException
,该主机发送一个重置(我认为这是
RST
数据包)和一个
SocketTimeoutException
,如果您的连接超时

如果您再次谈论IO,如果服务器断开连接,您将得到一个
SocketException
,而如果IO超时(可能只是读取),您将得到一个
SocketTimeoutException

这是我使用的测试程序。我当然在疯狂地流血

    try {
        new Socket().connect(new InetSocketAddress(someIpThatHangs, 8000), 1000);
        fail("Should have thrown");
    } catch (SocketTimeoutException e) {
        // we expected it to timeout
    }
    try {
        new Socket().connect(new InetSocketAddress(someIpThatResets, 1000));
        fail("Should have thrown");
    } catch (SocketException e) {
        // we expected it to throw an exception immediately on reset
    }

    // start our server
    final ServerSocket serverSocket = new ServerSocket();
    int serverPort = 8000;
    InetSocketAddress address = new InetSocketAddress("127.0.0.1", serverPort);
    serverSocket.bind(address);
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Socket clientSocket = serverSocket.accept();
                    System.err.println("Got a connection");
                    Thread.sleep(1000);
                    clientSocket.close();
                } catch (InterruptedException e) {
                    return;
                } catch (Exception e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    });
    thread.start();

    // wait for the server to start
    Thread.sleep(100);
    Socket clientSocket = new Socket();
    clientSocket.connect(address);

    try {
        // read until the server closes the connection
        clientSocket.getInputStream().read();
    } catch (SocketException e) {
        // expected socket exception
    }

    clientSocket = new Socket();
    clientSocket.connect(address);
    clientSocket.setSoTimeout(100);

    try {
        // read until the socket timeout expires
        clientSocket.getInputStream().read();
    } catch (SocketTimeoutException e) {
        // expected read timeout exception
    }

    serverSocket.close();
    thread.interrupt();

嗯,有一个小问题:SocketTimeoutException发生,即使我们没有通过读取操作收到任何信息。换句话说,SocketTimeoutException并不能保证连接丢失——它只是说我们得到了读取或接受命令的超时,并且在这段时间内没有收到任何东西(在你们的情况下是100毫秒)。对不起,伙计们,不是RST数据包,而是FIN标志!与及