Configurar um Java Socket para falha rápida na desconexão?
-
09-06-2019 - |
Pergunta
Eu tenho uma porta de escuta no meu servidor à qual estou me conectando usando uma classe Java e o Socket
interface, ou seja,
Socket mySocket = new Socket(host,port);
Eu então pego um OutputStream
, decore com um PrintWriter
no modo autoflush e estou rindo - exceto se a porta de escuta fechar.Então eu recebo
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
e não consigo detectar o problema no programa - tentei usar o isConnected()
método no soquete, mas parece não saber que a conexão está fechada.
Quero estar ciente do problema na próxima vez que tentar escrever no Socket para poder tentar reconectar e relatar o problema.
Algum conselho, por favor?
Obrigado a todos
Solução
Definir um tempo limite curto?
Faz isOutputShutdown()
não conseguir o que você quer?
Você sempre pode construir um SocketWatcher
classe que gira por conta própria Thread
e tenta repetidamente escrever strings vazias no Socket
até que isso levante um SocketClosedException
.
Outras dicas
A única maneira confiável de detectar uma conexão interrompida no TCP é gravá-la, o que eventualmente causará uma IOException de 'redefinição de conexão'.No entanto, devido ao buffer, isso não acontecerá na primeira gravação após a desconexão,p mas em uma gravação subsequente.Você não pode fazer nada sobre isso.
Defina um thread diferente para leitura do soquete.Ele será bloqueado até que o soquete seja fechado e então uma exceção será lançada.Capture essa exceção para detectar o fechamento imediatamente.