Java >> Java tutorial >  >> Tag >> java.net

Hvorfor får jeg java.net.SocketTimeoutException med OkHttp?

Du er højst sandsynligt påvirket af socket-timeouts pålagt af operativsystemet. Java kan ikke udvide dem, da sockets styres af systemet. I henhold til dette gode svar, afsnittet "Ændring af TCP-timeouts":

Desværre, da TCP-forbindelser administreres på OS-niveau, understøtter Java ikke konfiguration af timeouts på et per-socket-niveau, såsom i java.net.Socket . Jeg har fundet nogle forsøg på at bruge Java Native Interface (JNI) til at skabe Java-sockets, der kalder indbygget kode for at konfigurere disse muligheder, men ingen ser ud til at have udbredt fællesskabsadoption eller support.

For MacOS skal du se på sysctl net.inet.tcp output og se, hvad systemgrænserne er.


Jeg tror, ​​problemet er et andet sted. Timeout virker. Jeg prøvede følgende på min maskine, og det virkede i 30 sekunder

package test;

import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 *
 * @author jingged
 */
public class Test {
OkHttpClient httpClient = null;
     void initClient(){
        httpClient = new OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Test test = new Test();
        test.initClient();
        for(int i = 0;i<10;i++){
            new Thread(new Runnable(){
                @Override
                public void run() {
                   Request request = new Request.Builder().url("https://10.255.255.1").build();
                   Instant start = Instant.now();
                   try (Response response = test.httpClient.newCall(request).execute()) {
                        String s =  response.body().string();
                        System.out.println(s);
                    } catch (IOException ex) {
                        if (ex instanceof java.net.SocketTimeoutException){
                            System.err.print("Socket TimeOut");
                        }else{
                            ex.printStackTrace();
                        }
                    }
                   Instant end = Instant.now();
                    Duration interval = Duration.between(start, end);
                    System.out.println("Execution time " + interval.getSeconds()+" seconds");
                }

            }).start();
        }
    }
}

Output:

Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Execution time 30 seconds
Socket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOutSocket TimeOut
BUILD SUCCESSFUL (total time: 32 seconds)

Prøv ovenstående kode. URL'en nævnt i ovenstående kode vil producere TimeOut-undtagelse, da den ikke eksisterer, men timeout-tiden skulle holde den i gang i 30 sekunder. BTW Jeg testede dette på MAC OS High Sierra med Java 8 og netbeans 8.2 med okhttp3


Java tag