Ответ 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
Я должен сказать, что документация в данный момент неясна и что имя метода немного вводит в заблуждение.