gpt4 book ai didi

android - javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I/O错误,对等方重置了连接

转载 作者:行者123 更新时间:2023-12-02 02:00:17 41 4
gpt4 key购买 nike

在过去的几周中,我们的客户开始看到数百个此类“ SSLException错误-对等重置连接”,我不知道为什么


我们在okhttp上使用Retrofit,没有特殊配置

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是使用此注入的客户端(我们使用匕首)构建的-

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并使用Open SSL
我们的服务器最近已移至其他地区的另一个托管服务提供商,所以我不知道这些是否是DNS故障
我们试图调整诸如keepAlive,重新配置服务器上的OpenSSL之类的内容,但是由于某些原因,Android客户端不断出现此错误
当您尝试使用该应用发布内容或拉动刷新时,它会立即发生而没有任何延迟(它甚至不会进入网络或在此异常发生之前会出现延迟,这暗示连接已经断开)。但是尝试多次以某种方式“修复”它,我们获得了成功。以后再发生
我们已使服务器上的DNS条目无效,以查看是否是造成此问题的原因,但这并没有帮助
它主要发生在LTE,但我也在Wifi上看到过


我不想禁用保持活动状态,因为大多数现代客户都不会这样做。另外,我们使用的是OkHttp 2.4,这在后期冰淇淋三明治设备上是一个问题,因此我希望它可以解决这些潜在的网络问题。 iOS客户端也会获得这些例外,但减少了近100倍(iOS客户端使用AFNetworking 2.0)。我正在努力寻找新的东西来尝试,有什么帮助/想法吗?

更新-通过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)
]}

最佳答案

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

分析:


SSLException:SSL(安全套接字层)发生异常,这是在JDK(javax.net.ssl)的openJDK/oracleJDK/AndroidSDK包中实现的
Read error ssl=# I/O error during system call:从安全套接字读取时发生错误。这是在使用本机系统库/驱动程序时发生的。请注意,所有平台solaris,Windows等都有自己的套接字库,SSL会使用它们。 Windows使用WINSOCK库。
Connection reset by peer:系统库报告此消息(Solaris报告ECONNRESET,Windows报告WSAECONNRESET),由于远程主机强行关闭了现有连接,因此数据传输中使用的套接字不再可用。需要在主机和客户端之间创建一条新的安全路径


原因:

了解此问题后,我尝试查找连接重置背后的原因,并提出以下原因:


远程主机上的对等应用程序突然停止,主机重新启动,主机或远程网络接口被禁用,或者远程主机使用硬关闭。
如果在进行一个或多个操作时由于持续活动检测到故障而导致连接断开,也可能导致此错误。正在进行的操作因Network dropped connection on reset(On Windows(WSAENETRESET))失败,而后续操作因Connection reset by peer(On Windows(WSAECONNRESET))失败。
如果目标服务器受防火墙保护(在大多数情况下为真),则与端口相关联的生存时间(TTL)或超时将在给定超时时强制关闭空闲连接。这是我们的兴趣


解析度:


不能以任何方式处理服务器端的事件,例如突然的服务停止,重新启动,禁用网络接口。
在服务器端,为给定端口配置更高的生存时间(TTL)或超时值(例如3600秒)的防火墙。
客户端可以“尝试”保持网络活动以避免或减少Connection reset by peer
通常情况下,网络流量会保持连接畅通,并且不会频繁出现问题/异常。强大的Wifi上网机会最少。
对于分组数据传输是间歇性的并且取决于移动网络可用性的移动网络2G,3G和4G,它可能无法重置服务器端的TTL计时器,并导致进入Connection reset by peer


建议在各种论坛上设置以下术语以解决此问题


Connection reset by peer仅在建立连接时使用。如果主机花费时间来建立连接,则较高的值将使客户端等待连接。
ConnectionTimeout::套接字超时-表示接收数据包以将连接视为活动状态的最长时间。如果在给定时间内未接收到数据,则假定连接已停止/断开。
SoTimeout:直到排队等待发送数据并且在套接字上调用close socket函数时,套接字不应该关闭的时间。
Linger:是否要禁用保存和累积TCP数据包的缓冲区,并在达到阈值后将其发送?将其设置为true将跳过TCP缓冲,以便立即发送每个请求。网络变慢可能是由于较小和更频繁的数据包传输导致网络流量增加所致。


因此,以上参数均无法帮助保持网络正常运行并因此使其无效。

我发现一种设置可能有助于解决此功能的问题

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


我如何解决我的问题?


设置 TcpNoDelay
捕获 HttpConnectionParams.setSoKeepAlive(params, true)并检查 SSLException的异常消息
如果发现异常,请存储下载/读取进度并创建一个新连接。
如果可能,请继续下载/读取,否则请重新开始下载


希望细节有所帮助。快乐编码...

关于android - javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I/O错误,对等方重置了连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57377958/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com