- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去的几周中,我们的客户开始看到数百个此类“ 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.Builder restAdapterBuilder = new RestAdapter.Builder()
.setConverter(converter)
.setEndpoint(networkRequestDetails.getServerUrl())
.setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
.setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
);
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/
我是一名优秀的程序员,十分优秀!