ConnectionTimeout contro SocketTimeout


135

Sto riscontrando un problema con una libreria che sto utilizzando. Potrebbe essere la libreria o potrebbe essere che io lo stia usando male!

Fondamentalmente, quando lo faccio (Timeout in millisecondi)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Non viene generata alcuna eccezione di timeout e funziona bene, tuttavia, quando eseguo le seguenti operazioni,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Ottengo un'eccezione socket.

Quindi, la mia domanda è: perché non posso simulare un'eccezione di connessione? Sto fraintendendo la differenza tra un socket e un timeout della connessione? La libreria è qui (non ancora ufficialmente rilasciata).

Risposte:


227

Un timeout della connessione si verifica solo all'avvio della connessione TCP. Questo di solito accade se la macchina remota non risponde. Ciò significa che il server è stato spento, hai utilizzato il nome IP / DNS errato, la porta errata o la connessione di rete al server è inattiva.

Un timeout socket è dedicato al monitoraggio del flusso di dati in entrata continuo. Se il flusso di dati viene interrotto per il timeout specificato, la connessione viene considerata bloccata / interrotta. Naturalmente questo funziona solo con connessioni in cui i dati vengono ricevuti continuamente.

Impostando il timeout del socket su 1, ciò richiederebbe la ricezione di ogni millisecondo di nuovi dati (supponendo che si legga il blocco dati in modo saggio e che il blocco sia sufficientemente grande)!

Se solo il flusso in entrata si blocca per più di un millisecondo, si verifica un timeout.


1
Potresti mai ottenere un timeout della connessione se il server non è inattivo ma è occupato? O sarebbe un timeout del socket?
Robert,

9
Ciò dipende - se la connessione TCP è stata stabilita prima che il server sia sovraccarico, si otterrà un'eccezione socket - altrimenti si otterrà un'eccezione di connessione, indicando che non è stato possibile stabilire la connessione TCP.
Robert,

2
Considerando l'elevata latenza delle reti mobili soprattutto più vecchie, il timeout della connessione deve essere impostato su alcuni secondi (ad es. 10s o meglio 10000 msec). Il timeout del socket imposterei solo se non utilizzi più connessioni perché HTTP può riutilizzare la connessione dopo una richiesta.
Robert,

1
Ciò significa che se si imposta un timeout del socket (ad es. 1min), la connessione verrebbe interrotta dopo 1 minuto di inattività, dove normalmente verrebbe riutilizzata se non fosse impostato alcun timeout?
Robert,

2
@Robert Non otterrai necessariamente un'eccezione di connessione se il server è troppo occupato. Dipende dalla piattaforma, dalla piattaforma del server. Un timeout di lettura socket non interrompe la connessione. Causa solo un'eccezione SocketTimeoutException. Se la connessione è ancora utilizzabile è una decisione che l'applicazione deve prendere. Non c'è certamente nulla sull'API che dice che non puoi provare più I / O sul socket. La tua dichiarazione sul non usare i timeout se usi connessioni multiple non ha senso. Troppa disinformazione qui.
Marchese di Lorne,

83

Un timeout di connessione è il tempo massimo che il programma è disposto ad attendere per impostare una connessione a un altro processo. A questo punto non stai ricevendo o pubblicando alcun dato sull'applicazione, stai solo stabilendo la connessione stessa.

Un timeout socket è il timeout in attesa di singoli pacchetti. È un'idea sbagliata comune che un timeout del socket sia il timeout per ricevere la risposta completa. Pertanto, se si dispone di un timeout del socket di 1 secondo e di una risposta composta da 3 pacchetti IP, in cui ogni pacchetto di risposta impiega 0,9 secondi per arrivare, per un tempo di risposta totale di 2,7 secondi, non si verificherà alcun timeout.


3
Va bene. 1. Quindi possiamo dire che SocketTimeout viene visualizzato solo quando è già stata stabilita una connessione? 2. Cosa succede se non esiste un flusso di dati per esempio, diciamo 5 minuti dopo la ricezione dei 3 pacchetti? Ci sarà un'eccezione SocketTimeout dopo la ricezione del terzo pacchetto?
Saurabh Patil,

2
@SaurabhPatil 1. Sì. Consulta la panoramica tecnica di Wikipedia sul protocollo HTTP per la conferma. 2. Una volta inviata la fine del messaggio, non sono necessari ulteriori dati, quindi non si verificherà un timeout del socket. Vedi questa risposta sull'argomento.
entpnerd

7
Vorrei che avessero chiamato "timeout socket" come "timeout di inattività".
Manish Maheshwari,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.