Как определить, закрыто ли соединение с сервером (получен пакет RST) в Java? - PullRequest
1 голос
/ 29 марта 2012

Я использую класс Socket для своего TCP-соединения.Но моя текущая проблема состоит в том, чтобы точно определить причину отключения.В обоих случаях (если есть тайм-аут соединения или соединение сервера закрыто) я получаю исключение SocketException с сообщением «Сломанный канал».Так как же я могу точно определить причину отключения?

Спасибо!

1 Ответ

0 голосов
/ 30 марта 2012

Я думаю, вы должны получить другой Exception бросок.Если вы говорите о соединении, вы должны получить 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...