Подтвердить что ты не робот

Как сокет может быть подключен и закрыт?

Я использую клиент Java-сокета. В случае, когда сервер по-прежнему подключен к моему клиенту, но он не отправляет ответ на мое сообщение - я в конечном итоге получаю исключение тайм-аута чтения.

В этом случае я хочу проверить, следует ли мне повторно подключить мой сокет или просто сохранить его повторно.

Я использую это условие:

if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
    try {
        socket.close();
    } catch (IOException e1) {
    }
    // Wait on a new connection
    socket = connectSocket(.....);
}

Но я всегда, кажется, снова подключаюсь. Когда я регистрирую значения булевых свойств, я вижу следующее:

connected: true closed: true bound: true

Как он может быть подключен и закрыт?

ТИА

4b9b3361

Ответ 1

В этом разделе есть полезные обсуждения по этой теме. Оказывается, что Socket.isConnected возвращает true, если он был успешно подключен.

Из приведенного выше потока:

Когда вы используете Socket(), который вы, кажется, упустили, Socket.isConnected() указывает, был ли вызов Socket.connect()или нет. Аналогично для isClosed() и close().

Путаница в отношении этих методов приводит к запутыванию состояния сокет, который находится под контролем приложения, с состоянием общего соединения, которое находится под контролем протокола. isConnected() и isClosed() расскажите, что вы сделали с сокетом. Нет API, кроме чтения и записи, для определения состояния соединение.

В документах говорится:

Возвращает true, если сокет успешно подключен к серверу

и не так, как можно было бы ожидать: "возвращает true, если сокет подключен к серверу".

Поведение можно подтвердить, посмотрев на источник Socket:

public boolean isConnected() {
    // Before 1.3 Sockets were always connected during creation
    return connected || oldImpl;
}

Вы также можете запустить этот небольшой тестовый фрагмент:

Socket s = new Socket();

System.out.println("isConnected: " + s.isConnected() +
                  " isBound: "     + s.isBound() +
                  " isClosed: "    + s.isClosed());

s.connect(new InetSocketAddress("google.com", 80));

System.out.println("isConnected: " + s.isConnected() +
                   " isBound: "    + s.isBound() +
                   " isClosed: "   + s.isClosed());

s.close();

System.out.println("isConnected: " + s.isConnected() +
                   " isBound: "    + s.isBound() +
                   " isClosed: "   + s.isClosed());

Какие принты:

isConnected: false isBound: false isClosed: false
isConnected: true isBound: true isClosed: false
isConnected: true isBound: true isClosed: true

Я должен сказать, что документация в данный момент неясна и что имя метода немного вводит в заблуждение.