当前位置: 首页 > 知识库问答 >
问题:

sslexception:读取错误:SSL=0x9524b800:系统调用期间发生I/O错误,连接由对等方重置

芮星海
2023-03-14
public class OkHttpClientProvider implements IOkHttpClientProvider {

    OkHttpClient okHttpClient;

    public OkHttpClientProvider() {
        this.okHttpClient = createClient();
    }

    public OkHttpClient getOkHttpClient() {
        return this.okHttpClient;
    }

    private OkHttpClient createClient() {
        return new OkHttpClient();
    }
}
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
                                        .setConverter(converter)
                                        .setEndpoint(networkRequestDetails.getServerUrl())
                                        .setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
                                        .setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
                                        );

>

  • 服务器上的保持活动持续时间为180秒,OkHttp的默认值为300秒

    服务器在其头中返回“Connection:Close”,但客户端请求发送“Connection:KeepAlive”

    服务器支持TLS 1.0/1.1/1.2,并使用开放式SSL

    更新-通过okhttp添加全堆栈跟踪

          retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
                  at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390)
                  at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
                  at java.lang.reflect.Proxy.invoke(Proxy.java:397)
                  at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
                  at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
                  at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
                  at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
                  at android.os.AsyncTask$2.call(AsyncTask.java:292)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                  at java.lang.Thread.run(Thread.java:818)
           Caused by: javax.net.ssl.SSLException: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
                  at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
                  at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699)
                  at okio.Okio$2.read(Okio.java:137)
                  at okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
                  at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
                  at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
                  at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
                  at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
                  at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
                  at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917)
                  at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:793)
                  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
                  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
                  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
                  at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
                  at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
                  at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
                  at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
                  at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
                  at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
                  at java.lang.reflect.Proxy.invoke(Proxy.java:397)
                  at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
                  at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
                  at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
                  at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
                  at android.os.AsyncTask$2.call(AsyncTask.java:292)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                  at java.lang.Thread.run(Thread.java:818)
          ]}
    
  • 共有1个答案

    梁丘翔
    2023-03-14

    最近,我在处理一些遗留代码时遇到了这个问题。在谷歌搜索后,我发现这个问题无处不在,但没有任何具体的解决方案。我处理了异常消息的各个部分,并在下面进行了分析。

    分析:

    1. SSLException:SSL(安全套接字层)发生异常,该层在JDK的javax.net.SSL包(openjdk/oraclejdk/androidsdk)
    2. 中实现
    3. 读取错误ssl=#I/O错误在系统调用期间:从安全套接字读取时发生错误。它是在使用本机系统库/驱动程序时发生的。请注意,所有的平台solaris、Windows等都有自己的套接字库,由SSL使用。Windows使用WINSOCK库。
    4. 由对等方重置连接:系统库报告此消息(Solaris reportseconnreset,Windows reportswsaeconnreset)称,由于远程主机强制关闭现有连接,数据传输中使用的套接字不再可用。需要在主机和客户端之间创建一个新的安全路径
      null
      null
      null

    因此,上述参数中没有一个有助于保持网络的活力,从而使其失效。

    我发现了一个可能有助于解决这个问题的设置,这就是函数

    setKeepAlive(true)
    setSoKeepalive(HttpParams params, enableKeepalive="true") 
    

    我是如何解决我的问题的?

      null
     类似资料:
    • 我使用的是是一款开源的100%纯驱动程序,适用于。 -我有连接池配置下面 有时,我会遇到以下异常情况:无法从sql server获取连接。我不知道为什么? java.sql.SQLExc0019: I/O错误:连接重置由对等:套接字写入错误net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052)net.sourceforge.j

    • 尝试将数据发布到api时出错。下面是代码片段。期待早日得到帮助!谢谢 7组织。springframework。网状物客户ResourceAccessException:“jirasdtest.myoutotec.com/rest/api/2/issue/SD-1043/comment”的POST请求出现I/O错误:连接超时;嵌套异常为java。网SocketTimeoutException:连接在

    • 问题内容: 我正在尝试做一个简单的HttpGet来读取网页。我在iOS和Android上通过http(而非https)工作。 网址是内部网络IP和自定义端口,因此我可以使用以下路径使用http读取此类内容: 当我尝试使用https时,出现错误。所以我尝试使用此代码: 但这给我一个错误。 我究竟做错了什么?我可以放心地忽略该证书,因为它是一个具有自签名证书的内部网络,但是我无法控制版本,我的应用程序

    • 我正在使用Spring RestTemplate进行RESTful调用。我还使用自定义ClientHttpRequestInterceptor记录请求和响应,以便进行调试。 为了多次读取响应(一次用于日志记录,一次用于处理),我使用了BufferingClienthtPrequestFactory。以下是设置: 不知道为什么会发生这种情况,但我打开了调试器,并为request.getBody()设

    • 我总是在尝试获取https资源时得到相同的错误: 我有一个运行应用程序的自签名虚拟主机,应用程序在上运行良好,但我需要。 我尝试了这个解决方案,但没有成功,也犯了同样的错误 获取所有必需的证书(root和任何中间CA) 使用keytool和BouncyCastle提供程序创建密钥库并导入证书 在android应用程序中加载密钥存储库并使用它进行安全连接不要使用标准java.net.ssl.Http