在翻新中区分writeTimeout,readTimeout和connectTimeout吗?

时间:2018-11-12 07:07:01

标签: android retrofit retrofit2

我想将一些json字符串发布到某个URL。我收到

 Exception: java.net.SocketTimeoutException: failed to connect to 

有关此问题的大量搜索结果,人们建议在改造中增加和减少超时参数。我想知道writeTimeout,readTimeout和connectTimeout之间的区别。这样我就可以触发SocketTimeoutException。这是我的老客户。

    public static Retrofit getClient() {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().writeTimeout(20, TimeUnit.SECONDS).
//.authenticator(new Authen()).

        readTimeout(30, TimeUnit.SECONDS).
                        connectTimeout(20, TimeUnit.SECONDS).
                        addInterceptor(interceptor).build();

        return new Retrofit.Builder()
                .baseUrl(DefinesClass.ITS_URL)
//                .baseUrl("https://reqres.in")
//                .addConverterFactory(GsonConverterFactory.create())
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .client(client)
                .build();


    }

有什么办法可以对异常帮助人员进行排序?

2 个答案:

答案 0 :(得分:2)

SocketTimeOut表示您的客户端无法访问服务器。尝试在 Postman 中测试WebService。

  • 连接超时是用于创建TCP的超时 与HTTP服务器的连接。如果此时TCP握手未完成,则连接尝试失败。
  • 读取超时是从您拥有的那一刻起应用的超时 建立了一个连接(这样就完成了握手,并且可以使用该连接)。如果在此超时时间内服务器没有数据, 连接终止。

与写超时相同,我们未能在给定时间内写任何东西。

答案 1 :(得分:1)

这三种方法之间的差异如下:

  

connectTimeout:

设置新连接的默认连接超时。值0表示没有超时,否则值转换为毫秒时必须在1到Integer.MAX_VALUE之间。

将TCP套接字连接到目标主机时,将应用 connectTimeout 。默认值为10秒。

  

readTimeout:

设置新连接的默认读取超时。值0表示没有超时,否则值转换为毫秒时必须在1到Integer.MAX_VALUE之间。

读取超时适用于TCP套接字,也适用于单个读取IO操作,包括在响应源上。默认值为10秒。

  

writeTimeout:

设置新连接的默认写入超时。值0表示没有超时,否则值转换为毫秒时必须在1到Integer.MAX_VALUE之间。

写超时适用于单独的写IO操作。默认值为10秒。


来自here的来源。