1) Qual a diferença entre conexão e tempo limite de leitura para soquetes?
O tempo limite da conexão é o tempo limite para fazer a conexão inicial; isto é, concluir o handshake da conexão TCP. O tempo limite de leitura é o tempo limite de espera para ler os dados 1 . Especificamente, se o servidor falhar ao enviar um byte <timeout> segundos após o último byte, um erro de tempo limite de leitura será gerado.
2) O que o tempo limite da conexão definido como "infinito" significa? Em que situação ele pode permanecer em um loop infinitivo? e o que pode provocar que o loop infinito morra?
Isso significa que a tentativa de conexão pode potencialmente bloquear para sempre. Não há loop infinito, mas a tentativa de conexão pode ser desbloqueada por outro thread que fecha o soquete. (Uma Thread.interrupt()
chamada também pode fazer o truque ... não tenho certeza.)
3) O que o tempo limite de leitura definido como "infinito" significa? Em que situação ele pode permanecer em um loop infinito? O que pode provocar que o loop infinito termine?
Isso significa que uma chamada para read
o fluxo do soquete pode ser bloqueada para sempre. Mais uma vez, não há loop infinito, mas read
pode ser desbloqueado por uma Thread.interrupt()
chamada, fechando o soquete e (é claro) a outra extremidade enviando dados ou fechando a conexão.
1 - Não é ... como um comentarista pensou ... o tempo limite de quanto tempo um soquete pode ser aberto ou ocioso.
HttpURLConnection.getResponseCode()
estava pendurado por aproximadamente. uma semana até reiniciarmos o processo. Obviamente, não havia tempo limite definido no lado da JVM e também não houve tempo limite no lado do SO Linux.Socket.shutdownInput()
sem ter a mão na mão? NB Esses tempos limite são impostos pelo TCP, não pela JVM.