java.net.SocketException: il software ha causato l'interruzione della connessione: recv fallito [duplicato]

StackOverflow https://stackoverflow.com/questions/135919

  •  02-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

Non sono stato in grado di trovare una risposta adeguata a cosa significhi esattamente il seguente errore:

java.net.SocketException: il software ha causato l'interruzione della connessione: recv fallito

Note:

  • Questo errore è raro e imprevedibile; sebbene ottenere questo errore significhi che anche tutte le richieste future di URI falliranno.
  • L'unica soluzione che funziona (anche solo occasionalmente) è riavviare Tomcat e / o la macchina reale (Windows in questo caso).
  • L'URI è sicuramente disponibile (come confermato chiedendo al browser di eseguire il recupero).

Codice pertinente:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();
È stato utile?

Soluzione

Questo di solito significa che si è verificato un errore di rete, come un timeout TCP. Vorrei iniziare posizionando uno sniffer (WireShark) sulla connessione per vedere se riesci a vedere eventuali problemi. Se c'è un errore TCP, dovresti essere in grado di vederlo. Inoltre, è possibile controllare i registri del router, se applicabile. Se il wireless è coinvolto ovunque, questa è un'altra fonte per questo tipo di errori.

Altri suggerimenti

Ciò accade anche se il client TLS non è in grado di autenticarsi dal server configurato per richiedere l'autenticazione client.

Questo errore si verifica quando una connessione viene chiusa bruscamente (quando una connessione TCP viene ripristinata mentre sono ancora presenti dati nel buffer di invio). La condizione è molto simile a un "Ripristino connessione peer" molto più comune. Può succedere sporadicamente quando ci si connette su Internet, ma anche sistematicamente se i tempi sono corretti (ad es. Con connessioni keep-alive su localhost).

Un client HTTP dovrebbe semplicemente riaprire la connessione e ritentare la richiesta. È importante capire che quando una connessione è in questo stato, non c'è altra via che chiuderla. Qualsiasi tentativo di invio o ricezione produrrà lo stesso errore.

Non utilizzare URL.open () , utilizzare Apache-Commons HttpClient che ha un meccanismo di tentativi, pool di connessioni, keep-alive e molte altre funzionalità.

Utilizzo di esempio:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

Stai accedendo ai dati http? Puoi usare la libreria HttpClient invece della libreria standard? La libreria ha più opzioni e fornirà migliori messaggi di errore.

http://hc.apache.org/httpclient-3.x/

L'unica volta che ho visto accadere qualcosa del genere è quando ho una cattiva connessione o quando qualcuno sta chiudendo il socket che sto usando da un diverso contesto di thread.

Prova ad aggiungere "autoReconnect = true" alla stringa di connessione jdbc

Questo accadrà di volta in volta quando una connessione scade o quando un host remoto termina la connessione (applicazione chiusa, spegnimento del computer, ecc.). Puoi evitarlo gestendo i socket da solo e gestendo le disconnessioni nella tua applicazione tramite il suo protocollo di comunicazione e quindi chiamando shutdownInput e shutdownOutput per cancellare la sessione.

Cerca se hai un altro servizio o programma in esecuzione sulla porta http. Mi è successo quando ho provato ad usare la porta ed è stato preso da un altro programma.

Anch'io ho avuto questo problema. La mia soluzione era:

sc.setSoLinger(true, 10);

COPIA DA UN SITO WEB - > Usando il metodo setSoLinger () , puoi impostare esplicitamente un ritardo prima che venga inviato un reset, dando più tempo per la lettura o l'invio dei dati.

Forse non è la risposta a tutti ma ad alcune persone.

Se si utilizza Netbeans per gestire Tomcat, provare a disabilitare il monitoraggio HTTP in Strumenti - Server

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top