Как я могу проверить, является ли соединение SSLSocket нормальным на Java? - PullRequest
2 голосов
/ 25 августа 2010

У меня есть пул SSLSocket, и мне нужно проверить, является ли подключение к сокету нормальным, прежде чем заимствовать объект.

isConnected, isInputShutdown и isOutputShutdown бесполезны, поскольку они не проверяют, подключены ли обе стороны, иесли я пытаюсь писать или читать из сокета, я могу получить исключение SocketException.

Вот мой код для проверки соединения:

if(sslSocket.isConnected() && 
       !sslSocket.isInputShutdown() && 
       !sslSocket.isOutputShutdown()){
    valid = true;
}

Этот код не работает, как описано выше.

Итак, как лучше всего проверить, является ли SSLSocket (или обычный Socket) вменяемым?

Ответы [ 4 ]

3 голосов
/ 25 августа 2010

Если под «вменяемым» вы подразумеваете «подключенный», вы можете обнаружить, что TCP-сокет отключен только после попытки записи в него:

http://lkml.indiana.edu/hypermail/linux/kernel/0106.1/1154.html

Следовательно, вынеобходимо соответственно использовать исключение в Java.

0 голосов
/ 08 августа 2012

У меня была та же проблема, и здесь было исправлено: поскольку sslSocket создается из sslServerSocket , закрытие сокета сервера вместо сокета будет работать.

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

sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(sslServerSocketPort);
sslsocket = (SSLSocket) sslserversocket.accept();
sslsocket.setSoTimeout(5000);

// Restart connections
if(sslserversocket.isClosed() || sslserversocket == null){
    sslserversocket.close();
    startSSLServer();
}
0 голосов
/ 26 августа 2010

При чтении установите readTimeout через Socket.setSoTimeout () и перехватите SocketTimeoutException, или напишите и поймайте IOException: сброс соединения.Других механизмов нет.Упомянутые вами API isXXX () сообщают вам только то, что вы сделали с этим сокетом. Они ничего не сообщают вам о состоянии соединения .

0 голосов
/ 25 августа 2010

Разве попытка чтения из сокета и перехвата SocketException не будет достаточно разумной?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...