Android 网络异常

目录

  • 前言
  • 一、UnknownHostException
      • 1、网络断开验证
      • 2、DNS 服务器意外挂掉验证
      • 3、DNS 服务器故障验证
      • 4、所需诊断信息
  • 二、ConnectTimeoutException
  • 三、SocketTimeoutException
      • 1、子错误 - 读超时
      • 2、子错误 - SSL 握手超时
      • 3、子错误 - 未知原因
  • 四、HttpHostConnectException
      • 1、服务器故障验证
      • 2、代理服务器故障验证
      • 3、所需诊断信息
      • 4、参考资料
  • 五、NoRouteToHostException
  • 六、SSLException
      • 1、子错误 - SSL 读期间连接重置
      • 2、子错误 - SSL 握手期间连接重置
  • 七、SSLHandshakeException
      • 1、子错误 - 握手失败
      • 2、子错误 - 连接超时
      • 3、子错误 - 连接重置
      • 4、子错误 - 连接被关闭
  • 八、SSLProtocolException
      • 1、子错误 - 记录MAC无效的读失败
      • 2、子错误 - 协议版本导致的读失败
  • 九、NoHttpResponseException
  • 十、InterruptedIOException
      • 1、子错误 - 连接已关闭
  • 十一、IOException
      • 1、子错误 - 连接关闭
      • 2、子错误 - 请求被终止
  • 十二、SocketException
      • 1、子错误 - 读消息连接重置
      • 2、子错误 - 连接重置
      • 3、子错误 - Socket 关闭
  • 十三、ConnectException
      • 1、子错误 - 连接被拒绝
      • 2、子错误 - 主机不可达
      • 3、子错误 - 网络不可达
  • 十四、ClientProtocolException
      • 1、子错误 - 未知原因

前言


注:OkHttp 代码基于 OkHttp 3.4 分析。Android 代码基于 Android 6.0.0_r26 分析。

一、UnknownHostException


错误说明: 域名解析失败。

错误消息: Unable to resolve host “m9.music.126.net”: No address associated with hostname

可能原因:

  • 网络断开;
  • DNS 服务器意外挂掉;
  • DNS 服务器故障。

DNS 服务器挂掉或者故障这种问题比较少见,然而之前确实发生过大范围的DNS 服务器问题。

针对这些原因,我们可以做一些模拟测试。

1、网络断开验证


对于网络连接断开的情况,我们采用如下的方法来模拟测试:
  • 关闭手机的 WiFi 和移动网络,也就是使手机处于完全断网的情况;
  • 执行一个 HTTP 请求。

以 OkHttp 为例,在请求开始之后,立即就报出了如下的异常:

java.net.UnknownHostException: Unable to resolve host "www.wolfcstech.com": No address associated with hostnameat java.net.InetAddress.lookupHostByName(InetAddress.java:470)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)at java.net.InetAddress.getAllByName(InetAddress.java:215)at okhttp3.Dns$1.lookup(Dns.java:39)at com.netease.netlib.OkHttp3Utils$MyDns.lookup(OkHttp3Utils.java:45)at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:170)at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:136)at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:81)at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:171)at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at com.netease.netlib.OkHttp3Utils$MyInterceptor.intercept(OkHttp3Utils.java:29)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129)at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)at libcore.io.Posix.android_getaddrinfo(Native Method)at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)at java.net.InetAddress.lookupHostByName(InetAddress.java:451)... 30 more

2、DNS 服务器意外挂掉验证


对于DNS 服务器意外挂掉的情况,我们采用如下的方法模拟测试:
  • 连接 WiFi,设置手机的 IP 地址为静态 IP 地址,不修改之前 DHCP 分配的 IP 地址,但设置 DNS 服务器地址为无效的地址;
  • 执行一个 HTTP 请求。

以 OkHttp 为例,在请求开始之后,将报出如下的异常:

java.net.UnknownHostException: Unable to resolve host "www.wolfcstech.com": No address associated with hostnameat java.net.InetAddress.lookupHostByName(InetAddress.java:470)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)at java.net.InetAddress.getAllByName(InetAddress.java:215)at okhttp3.Dns$1.lookup(Dns.java:39)at com.netease.netlib.OkHttp3Utils$MyDns.lookup(OkHttp3Utils.java:45)at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:170)at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:136)at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:81)at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:171)at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at com.netease.netlib.OkHttp3Utils$MyInterceptor.intercept(OkHttp3Utils.java:29)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129)at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)at libcore.io.Posix.android_getaddrinfo(Native Method)at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)at java.net.InetAddress.lookupHostByName(InetAddress.java:451)... 30 more

这个异常与网络断开情况下报出的异常一模一样,然而这一次从请求开始执行到异常报出,经历的时间则要长得多,如我们上面看到的,这段时间长达 40 s。

3、DNS 服务器故障验证


DNS 服务器故障主要是指 DNS 服务器确实查不到所请求的域名,可能是 DNS 服务器出了问题,也可能是为域名做的 DNS 配置还没有生效等。

对于这种情况,我们采用如下方法模拟测试:

  • 手机正常连接网络;
  • 以一个不存在的域名执行一个 HTTP 请求。

请求执行之后,将报出如下异常:

java.net.UnknownHostException: Unable to resolve host "www.wolfcsteach.com": No address associated with hostnameat java.net.InetAddress.lookupHostByName(InetAddress.java:470)at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)at java.net.InetAddress.getAllByName(InetAddress.java:215)at okhttp3.Dns$1.lookup(Dns.java:39)at com.netease.netlib.OkHttp3Utils$MyDns.lookup(OkHttp3Utils.java:45)at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:170)at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:136)at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:81)at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:171)at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at com.netease.netlib.OkHttp3Utils$MyInterceptor.intercept(OkHttp3Utils.java:29)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129)at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)at libcore.io.Posix.android_getaddrinfo(Native Method)at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)at java.net.InetAddress.lookupHostByName(InetAddress.java:451)... 30 more

4、所需诊断信息


依据上面的测试分析,诊断域名解析问题,需要如下诊断信息:
  • 请求开始时间;
  • 异常报出时间;
  • 网络是否连接;
  • DNS 服务器 IP 地址列表;
  • DNS 服务器是否可用(ping DNS 服务器 IP地址的结果);
  • DNS 的结果(nslookup 结果)。

二、ConnectTimeoutException


等价异常类型:

  • org.apache.http.conn.ConnectTimeoutException
  • com.netease.mam.org.apache.http.conn.ConnectTimeoutException

错误说明: 连接超时

错误消息: Connect to /183.214.133.45:443 timed out

异常分析:

异常在 external/apache-http/src/org/apache/http/conn/scheme/PlainSocketFactory.javaconnectSocket() 中,apache httpclient 抛出,由 Socket.connect() 中抛出的 SocketTimeoutException 引起。

可能原因:

  • 设备接入的网络本身带宽比较低;
  • 设备接入的网络本身延迟比较高;
  • 设备与服务器的网络路径中存在比较拥堵、负载比较重的节点;
  • 网络中路由节点的临时性异常。

所需诊断信息:

  • Traceroute 获取的网络路径信息。
  • 网络路径上不同节点的繁忙程度,可通过丢包率来近似地反映。
  • 网络连接条件(移动网络/WiFI),网络延时及带宽。

三、SocketTimeoutException


异常: java.net.SocketTimeoutException

错误说明: socket 超时

异常分析:

在 OkHttp 处理 HTTP/2 的逻辑 (okhttp3.internal.http2.Http2Stream) 中,会由于读超时、写超时而抛出该异常。

在 Android 中,java.net.PlainSocketImplaccept(SocketImpl newImpl) 执行失败,如果 errno 为 EAGAIN 将抛出该异常,如果使用 nio 的 ServerSocketChannelImpl,异常将不会被实际抛出;此外,在阻塞 Socket 上读取长度为 0 的数据时抛出此异常。

libcore.io.IoBridge 中,TCP 连接建立超时,将抛出该异常。libcore.io.IoBridge中,接收数据失败,会由于 errnoEAGAIN 抛出该异常。

external/conscrypt/src/main/native/org_conscrypt_NativeCrypto.cpp 中执行 SSL/TLS 握手动作、数据读操作或数据写操作超时,会抛出该异常。

1、子错误 - 读超时


错误消息: Read timed out

异常分析:

external/conscrypt/src/main/native/org_conscrypt_NativeCrypto.cpp 中执行 SSL/TLS 数据读操作超时,抛出该异常。

可能原因:

  • 设备接入的网络本身带宽比较低;
  • 设备接入的网络本身延迟比较高;
  • 设备与服务器的网络路径中存在比较拥堵、负载比较重的节点;
  • 网络中路由节点的临时性异常。

所需诊断信息:

  • Traceroute 获取的网络路径信息。
  • 网络路径上不同节点的繁忙程度,可通过丢包率来近似地反映。
  • 网络连接条件(移动网络/WiFI),网络延时及带宽。

2、子错误 - SSL 握手超时


错误消息: SSL handshake timed out

异常分析:

external/conscrypt/src/main/native/org_conscrypt_NativeCrypto.cpp 中执行 SSL/TLS 握手动作超时,抛出该异常。

可能原因:

  • 设备接入的网络本身带宽比较低;
  • 设备接入的网络本身延迟比较高;
  • 设备与服务器的网络路径中存在比较拥堵、负载比较重的节点;
  • 网络中路由节点的临时性异常。

所需诊断信息:

  • Traceroute 获取的网络路径信息。
  • 网络路径上不同节点的繁忙程度,可通过丢包率来近似地反映。
  • 网络连接条件(移动网络/WiFI),网络延时及带宽。

3、子错误 - 未知原因


错误消息: null

异常分析:

根据 SocketTimeoutException 抛出的所有情况综合来看,这种异常主要由 HTTP 请求读操作执行超时引起。

可能原因:

  • 设备接入的网络本身带宽比较低;
  • 设备接入的网络本身延迟比较高;
  • 设备与服务器的网络路径中存在比较拥堵、负载比较重的节点;
  • 网络中路由节点的临时性异常。

所需诊断信息:

  • 更加完整的异常堆栈
  • Traceroute 获取的网络路径信息。
  • 网络路径上不同节点的繁忙程度,可通过丢包率来近似地反映。
  • 网络连接条件(移动网络/WiFI),网络延时及带宽。

四、HttpHostConnectException


等价异常类型:

  • org.apache.http.conn.HttpHostConnectException
  • com.netease.mam.org.apache.http.conn.HttpHostConnectException

错误说明: 客户端的数据包可以到达目标主机,但由于各种原因,连接建立失败的问题。

错误消息: Connection to http://m7.music.126.net refused

可能原因:

  • 连接的目标主机没有开对应的端口,可能服务器发生故障
  • 客户端设置了代理,而代理进程并没有跑起来。

针对这些原因,我们也可以做一些模拟和测试。

1、服务器故障验证


对于这种情况,我们采用如下的方法来模拟测试,
  • 指定我们执行 HTTP 请求时访问的端口为一个无效的端口,如使用 URL ;
  • 以 HttpClient 作为我们的 HttpStack 来执行 HTTP 请求。

请求执行之后,将报出如下异常:

org.apache.http.conn.HttpHostConnectException: Connection to https://www.wolfcstech.com:8080 refusedat org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:193)at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:596)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:517)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:495)at com.netease.volleydemo.HttpClientUtils.httpGet(HttpClientUtils.java:21)at com.netease.volleydemo.MainActivity$HttpClientTask.doInBackground(MainActivity.java:152)at com.netease.volleydemo.MainActivity$HttpClientTask.doInBackground(MainActivity.java:142)at android.os.AsyncTask$2.call(AsyncTask.java:307)at java.util.concurrent.FutureTask.run(FutureTask.java:237)at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:246)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: java.net.ConnectException: failed to connect to /139.196.224.72 (port 8080): connect failed: ECONNREFUSED (Connection refused)at libcore.io.IoBridge.connect(IoBridge.java:124)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)at java.net.Socket.connect(Socket.java:938)at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)... 15 more
Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
04-27 14:45:44.822    at libcore.io.Posix.connect(Native Method)at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)at libcore.io.IoBridge.connectErrno(IoBridge.java:137)at libcore.io.IoBridge.connect(IoBridge.java:122)... 20 more

org.apache.http.conn.HttpHostConnectException 的 errorMessage 向我们指出是服务器拒绝连接。

对于同样的问题,如果以 OkHttp 作为 HttpStack 来执行请求的话,则将报出稍有不同的异常:

java.net.ConnectException: Failed to connect to www.wolfcstech.com/139.196.224.72:8080at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:222)at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:146)at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:186)at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at com.netease.netlib.OkHttp3Utils$MyInterceptor.intercept(OkHttp3Utils.java:29)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129)at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: java.net.ConnectException: failed to connect to www.wolfcstech.com/139.196.224.72 (port 8080) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)at libcore.io.IoBridge.isConnected(IoBridge.java:234)at libcore.io.IoBridge.connectErrno(IoBridge.java:171)at libcore.io.IoBridge.connect(IoBridge.java:122)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)at java.net.Socket.connect(Socket.java:938)at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:63)at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:220)... 24 more
Caused by: android.system.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)at libcore.io.IoBridge.isConnected(IoBridge.java:223)... 31 more

OkHttp 抛出 java.net.ConnectException,仅仅简单地指出连接服务器失败。

2、代理服务器故障验证


这主要是指代理服务器进程没有启动,或代理设置存在问题。

对于这种情况,我们通过如下的方法来模拟测试:

  • 使手机连接 WiFi;
  • 为手机所连接的 WiFi 设备设置代理,其中代理服务器的地址为无效的 IP 地址,或端口为无效端口;
  • 以 HttpClient 作为我们的 HttpStack 来执行 HTTP 请求。

请求执行之后,将报出如下异常:

org.apache.http.conn.HttpHostConnectException: Connection to http://10.240.252.44:8888 refusedat org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:193)at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:596)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:517)at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:495)at com.netease.volleydemo.HttpClientUtils.httpGet(HttpClientUtils.java:21)at com.netease.volleydemo.MainActivity$HttpClientTask.doInBackground(MainActivity.java:152)at com.netease.volleydemo.MainActivity$HttpClientTask.doInBackground(MainActivity.java:142)at android.os.AsyncTask$2.call(AsyncTask.java:307)at java.util.concurrent.FutureTask.run(FutureTask.java:237)at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:246)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)Caused by: java.net.ConnectException: failed to connect to /10.240.252.44 (port 8888): connect failed: ECONNREFUSED (Connection refused)at libcore.io.IoBridge.connect(IoBridge.java:124)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)at java.net.Socket.connect(Socket.java:938)at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)... 15 moreCaused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)at libcore.io.Posix.connect(Native Method)at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)at libcore.io.IoBridge.connectErrno(IoBridge.java:137)at libcore.io.IoBridge.connect(IoBridge.java:122)... 20 more

对于同样的问题,OkHttp 报出了不同的异常:

java.net.ConnectException: Failed to connect to /10.240.252.44:8888at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:222)at okhttp3.internal.connection.RealConnection.connectTunnel(RealConnection.java:195)at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:144)at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:186)at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at com.netease.netlib.OkHttp3Utils$MyInterceptor.intercept(OkHttp3Utils.java:29)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)at okhttp3.RealCall$AsyncCall.execute(RealCall.java:129)at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)at java.lang.Thread.run(Thread.java:833)
Caused by: java.net.ConnectException: failed to connect to /10.240.252.44 (port 8888) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)at libcore.io.IoBridge.isConnected(IoBridge.java:234)at libcore.io.IoBridge.connectErrno(IoBridge.java:171)

3、所需诊断信息


为了确认所报出的异常产生的根源,需要下的诊断信息:
  • 连接的目标主机的 IP 地址;
  • 连接建立的目标端口;
  • 用户设置的代理服务器地址和端口;
  • TCP 连接目标 IP:端口 的结果。

4、参考资料


针对这个异常,网络上有其它的一些资料和讨论,相关链接如下:
  • Stack Overflow 讨论
  • Android 5.0 抛出异常的相关源码
  • Android 官方文档对该异常的说明

五、NoRouteToHostException


异常: java.net.NoRouteToHostException

错误说明: 无法连接远程地址与端口。

错误消息: No route to host

可能原因:

  • 防火墙的规则设置导致数据包无法被发送出去;
  • 中间路由节点挂掉。

所需诊断信息:

  • 用户防火墙配置;
  • 目标主机是否可以访问(ping)。

参考资料:

  • Stack Overflow 的讨论
  • Android 官方对异常的说明

六、SSLException


异常: javax.net.ssl.SSLException

错误说明: SSL 失败


1、子错误 - SSL 读期间连接重置


错误消息: Read error: ssl=0xf49f7200: I/O error during system call, Connection reset by peer

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。
  • 遭受网络 TCP Reset 攻击。

异常分析:

在网络数据传输期间,TCP 连接意外结束,由于服务器进程意外终止等原因,没有经过正常的 TCP 连接断开过程。后续客户端向服务器发送 TCP 包,如数据包、ACK 包等,服务器返回 RST 包所致。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

参考资料:

  • 从TCP协议的原理来谈谈rst复位攻击

2、子错误 - SSL 握手期间连接重置


错误消息: SSL handshake aborted: ssl=0x79c484c0: I/O error during system call, Connection reset by peer

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。
  • 遭受网络 TCP Reset 攻击。

异常分析:

以 Android 6.0.0_r1 为例,仅有的出现 “SSL handshake aborted” 的位置为 http://androidxref.com/6.0.0_r1/xref/external/conscrypt/src/main/native/org_conscrypt_NativeCrypto.cpp — NativeCrypto_SSL_do_handshake()。

异常的 error message 构造过程为 NativeCrypto_SSL_do_handshake() -> throwSSLExceptionWithSslErrors() -> asprintf() (error code 为 SSL_ERROR_SYSCALL )。

errorCode 由 SSL_do_handshake(SSL s) 返回,但在 SSL_do_handshake(SSL s),实际由 SSL *s 的回调函数 s -> handshake_func 执行。handshake_func 在两个地方赋值,对于服务器而言,在 SSL_set_accept_state() 中,该回调等于 ssl -> method -> ssl_accept;对于客户端而言,该回调在 SSL_set_connect_state() 中赋值,等于 ssl -> method -> ssl_connectSSL *s 结构的 SSL_PROTOCOL_METHOD *method,在 SSL 结构创建时赋值,SSL 结构的创建主要在 NativeCrypto_SSL_new() -> SSL_new() 完成。SSL *s 结构的 SSL_PROTOCOL_METHOD *method 来源于 SSL_CTX 的 method。SSL_CTX 结构在 NativeCrypto_SSL_CTX_new() 中创建,SSL_CTX 结构的 method 来自于 SSLv23_method(),实际为 TLS_method(void) 函数中的静态结构,protocol_methodTLS_protocol_method

最终可以发现 SSL *s 的回调函数 s->handshake_funcssl3_connect(SSL *s)。在 ssl3_connect(SSL *s) 中,以一种状态机模式的方式,逐步完成 SSL/TLS 握手,在遇到错误时退出。

因而错误的发生,是由于在 ssl3_connect(SSL *s) 执行期间,TCP 连接意外结束,可能由于服务器进程意外终止等原因,没有经过正常的 TCP 连接断开过程。后续客户端向服务器发送 TCP 包,如数据包、ACK 包等,服务器返回 RST 包所致。但具体在 SSL/TLS 握手的哪个阶段异常发生,则难以判断。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

七、SSLHandshakeException


异常: javax.net.ssl.SSLHandshakeException

错误说明: SSL/TLS 握手失败


1、子错误 - 握手失败


错误消息: Handshake failed

可能原因:

  • 握手失败,证书验证失败
    • 未知证书颁发者;
    • 不完整的证书链;
    • 自签名证书;
    • 服务器主机名不匹配;
    • 严格安全重新协商失败;
    • 遭遇了中间人攻击。
  • 握手失败,协议协商失败/握手格式不兼容
  • 协议异常,服务器名称标识不匹配
  • 某些版本 SSL 库的 bug

所需诊断信息:

  • 异常的详细错误消息;
  • 客户端支持的 SSL/TLS 版本;
  • 客户端设置的 SNI 信息;
  • 服务器下发的证书链;
  • 客户端可用的加密套件。

对于特定的操作系统版本,其 SSL 库的版本和根证书库是固定的,对于这些重要的信息不再需要移动端上传。此外,证书链消耗流量可能会比较大,大概在几 KBytes


2、子错误 - 连接超时


错误消息: SSL handshake aborted: ssl=0xeec6d600: I/O error during system call, Connection timed out

可能原因:

  • 设备接入的网络本身带宽比较低;
  • 设备接入的网络本身延迟比较高;
  • 设备与服务器的网络路径中存在比较拥堵、负载比较重的节点;
  • 网络中路由节点的临时性异常。

所需诊断信息:

  • Traceroute 获取的网络路径信息。
  • 网络路径上不同节点的繁忙程度,可通过丢包率来近似地反映。
  • 网络连接条件(移动网络/WiFI),网络延时及带宽。

3、子错误 - 连接重置


错误消息: SSL handshake aborted: ssl=0xea0e4f00: I/O error during system call, Connection reset by peer

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。
  • 遭受网络 TCP Reset 攻击。

错误原因分析:

在网络数据传输期间,TCP 连接意外结束,可能由于服务器进程意外终止等原因,没有经过正常的 TCP 连接断开过程。后续客户端向服务器发送 TCP 包,如数据包、ACK 包等,服务器返回 RST 包所致。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

4、子错误 - 连接被关闭


错误消息: Connection closed by peer

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。

错误原因分析:

在网络数据传输期间,由于服务器回收 TCP 连接,或服务器进程意外结束,连接被提前结束,正常的 TCP 连接断开过程完成所致。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

八、SSLProtocolException


异常: javax.net.ssl.SSLProtocolException

错误说明: 协议异常


1、子错误 - 记录MAC无效的读失败


错误消息: Read error: ssl=0xf475ee00: Failure in SSL library, usually a protocol error error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac (external/openssl/ssl/s3_pkt.c:1308 0xe27a8ee0:0x00000003)

可能原因:

  • 数据在传输过程中被篡改。
  • MAC 方式不支持。
  • 某些版本SSL 库的 bug。

所需诊断信息:

  • 客户端支持的 SSL/TLS 版本;
  • 客户端可用的加密套件。

2、子错误 - 协议版本导致的读失败


错误消息: Read error: ssl=0xdbab7300: Failure in SSL library, usually a protocol error error:100c542e:SSL routines:ssl3_read_bytes:TLSV1_ALERT_PROTOCOL_VERSION (external/boringssl/src/ssl/s3_pkt.c:972 0xd3fb2d20:0x00000001)

可能原因:

  • 遭遇降级攻击;
  • 某些版本 SSL 库的 bug。

所需诊断信息:

  • 客户端支持的 SSL/TLS 版本;
  • 服务器下发的证书链;
  • 客户端可用的加密套件。

对于特定操作系统版本,其 SSL 库版本和根证书库是固定的,对于这些重要信息不再需要移动端上传。此外,证书链消耗流量可能会比较大,大概在几 KBytes


九、NoHttpResponseException


等价异常类型:

  • org.apache.http.NoHttpResponseException
  • com.netease.mam.org.apache.http.NoHttpResponseException

错误说明: 服务器响应异常

错误消息: The target server failed to respond

可能原因:

  • 服务器故障。

十、InterruptedIOException


异常: java.io.InterruptedIOException

错误说明: IO 中断


1、子错误 - 连接已关闭


错误消息: Connection has been shut down.

异常分析:

异常抛出的位置为 external/apache-http/src/org/apache/http/impl/conn/AbstractClientConnAdapter.javaassertNotAborted()

可能原因:

客户端在发送请求或接收响应时,发现连接已经被终止,请求被终止/取消。
IOException

异常: java.io.IOException

错误说明: IO 失败


十一、IOException


异常: java.io.IOException

错误说明: IO 失败


1、子错误 - 连接关闭


错误消息: Connection already shutdown

异常分析:

异常抛出的位置为 external/apache-http/src/org/apache/http/impl/conn/DefaultClientConnection.javaopening() 方法。

可能原因:

  • 连接打开动作执行过程中,被客户端关闭,请求被终止/取消。

2、子错误 - 请求被终止


错误消息: Request already aborted

异常分析:

异常抛出的位置为 external/apache-http/src/org/apache/http/client/methods/HttpRequestBase.javasetConnectionRequest()setReleaseTrigger() 中,设置连接请求和 ConnectionReleaseTrigger 时执行检查,发现请求被客户端终止。

可能原因:

  • 请求被终止/取消。

十二、SocketException


异常: java.net.SocketException

错误说明: Socket 异常


1、子错误 - 读消息连接重置


错误消息: recvfrom failed: ECONNRESET (Connection reset by peer)

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。
  • 遭受网络 TCP Reset 攻击。

错误原因分析:

在网络数据传输期间,TCP 连接意外结束,由于服务器进程意外终止等原因,没有经过正常的 TCP 连接断开过程。后续客户端向服务器发送 TCP 包,如数据包、ACK 包等,服务器返回 RST 包所致。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

2、子错误 - 连接重置


错误消息: Connection reset

可能原因:

  • 在网络数据传输期间,TCP 连接被服务器异常结束。
  • 遭受网络 TCP Reset 攻击。

错误原因分析:

在网络数据传输期间,TCP 连接意外结束,可能由于服务器进程意外终止等原因,没有经过正常的 TCP 连接断开过程。后续客户端向服务器发送 TCP 包,如数据包、ACK 包等,服务器返回 RST 包所致。

所需诊断信息:

  • 与目标服务器目标端口的 TCP 连接测试结果,检查目标服务器进程是否存活。

3、子错误 - Socket 关闭


错误消息: Socket closed

异常分析:

异常抛出的位置为 libcore/luni/src/main/java/libcore/io/IoBridge.java 的 isConnected()。

可能原因:

  • 连接被客户端关闭,请求被终止/取消。

十三、ConnectException


异常: java.net.ConnectException

错误说明: 连接失败

异常分析:

ConnectException 异常在 libcore.io.IoBridgeconnect(FileDescriptor fd, InetAddress inetAddress, int port, int timeoutMs)isConnected() 中抛出。在执行 socket 连接建立操作时,底层操作失败。错误信息中都会包含连接的目标主机的 IP,尝试连接的时间, errno 值及 errno 值对应的错误消息。通常可根据 errno 判断失败原因。


1、子错误 - 连接被拒绝


错误消息: failed to connect to /119.84.111.126 (port 80) after 30000ms: isConnected failed: ECONNREFUSED (Connection refused)

参考前面 HttpHostConnectException 相关说明。


2、子错误 - 主机不可达


错误消息: failed to connect to /153.101.65.23 (port 80) after 30000ms: isConnected failed: EHOSTUNREACH (No route to host)

可能原因:

  • 防火墙的规则设置导致数据包无法被发送出去;
  • 中间路由节点挂掉。

异常分析:

引发了ICMP目的不可达错误,这认为是软错误。client核心保存消息并且荏苒发送SYN。。如果超出一个确定的时间。保存的ICMP错误返回给进程 EHOSTUNREACH或者ENETUNREACH。ENETUNREACH被认为是过时的。所以返回的应该是EHOSTUNREACH。

所需诊断信息:

  • 用户防火墙配置;
  • 目标主机是否可以访问(ping)。

3、子错误 - 网络不可达


错误消息: failed to connect to /59.111.160.195 (port 80) after 30000ms: connect failed: ENETUNREACH (Network is unreachable)

可能原因:

  • 防火墙的规则设置导致数据包无法被发送出去;
  • 中间路由节点挂掉。

所需诊断信息:

  • 用户防火墙配置;
  • 目标主机是否可以访问(ping)。

十四、ClientProtocolException


等价异常类型:

  • com.netease.mam.org.apache.http.client.ClientProtocolException

错误说明: 协议错误

异常分析:

异常抛出的位置为 external/apache-http/src/org/apache/http/impl/client/AbstractHttpClient.javaexecute() 中。在执行 RequestDirector.execute() 时,捕获到 HttpException 异常时抛出该异常。 HttpException 异常抛出的位置主要有以下几个:

  • external/apache-http/src/org/apache/http/impl/client/DefaultRequestDirector.javacreateTunnelToTarget() 中通过 HTTP 的 CONNECT 方法建立隧道链接时,对端返回了小于 200 的响应码,隧道连接建立失败。
  • external/apache-http/src/org/apache/http/impl/conn/ProxySelectorRoutePlanner.javadetermineProxy() 中 URI 格式错误。URI 通过目标主机的 scheme ,主机名,端口等构造。
  • external/apache-http/src/org/apache/http/impl/conn/ProxySelectorRoutePlanner.javadetermineProxy() 中代理地址格式错误。

1、子错误 - 未知原因


错误消息: null

可能原因:

  • 这个错误主要与客户端的 HTTP 代理服务器设置有关。

所需诊断信息:

  • 如果是 HTTPS 请求,通过 HTTP 的 CONNECT 方法建立隧道链接时,CONNECT 请求的完整响应内容。
  • 代理服务器配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android ViewRoot、DecorViewWindow浅析

目录简介目录1、VeiwRoot1.1、简介1.2、特别注意2、DecorView2.1、定义2.2、作用2.3、特别说明3、Window4、Activity5、之间关系5.1、总结5.2、之间的关系简介 DecorView为整个Window界面的最顶层View。DecorView只有一个子元素为LinearLayout。代表整个Window界面,…

Java集合Stream类

Java集合Stream类 ----按条件对集合进行过滤filter public class Test {public static void main(String[] args) {List<String>allnew ArrayList<>();all.add("ghjt");all.add("ghjiiii");Stream<String>streamall.stream();List<S…

使用openssl完成aes-ecb模式的数据加解密,输入和输出都是字符串类型

代码 #include <cstring> #include <memory>#include <openssl/aes.h> #include <openssl/md5.h>namespace hsm{namespace mgmt{void get_md5_digest(const std::string &data,uint8_t result[16]){MD5_CTX md5_ctx{};MD5_Init(&md5_ctx);MD5…

Java Stream MapReduce大数据开发模型

实现一个购买商品后,对数据进行处理统计的功能. 将购买的商品信息保存在Orders类中 public class Orders {private String name;private double price;private int amount;public Orders(String name, double price, int amount) {this.name name;this.price price;this.am…

随机函数的生成

函数代码 #include <string>bool GenerateRandom(std::string *str,unsigned int len) {srand(time(NULL));for(unsigned int i0;i<len;i){switch(rand()%3){case 1:(*str).push_back(Arand()%26);break;case 2:(*str).push_back(arand()%26);break;default:(*str).p…

Android 为控件设置阴影

在Android中设置一个阴影很简单&#xff0c;只需要两步&#xff1a; 设置eleavation值&#xff08;高度&#xff09;添加一个背景或者outline &#xff08;即阴影的形状&#xff09; 说明&#xff1a; View的大小位置都是通过x&#xff0c;y确定的&#xff0c;而现在有了z轴的…

Android在代码中设置drawableLeft(Right/Top/Bottom)

根据业务的需要&#xff0c;要在代码中设置控件的drawableLeft&#xff0c;drawableRight&#xff0c;drawableTop&#xff0c;drawableBottom属性。 我们知道在xml中设置的方法为&#xff1a; android:drawableLeft"drawable/xxxxx"但是在代码中并没有相关的setDr…

Java 冒泡排序

冒泡排序–时间复杂度n^2 对数组序列从前向后依次比较相邻两个元素的大小,若逆序则两个元素交换位置如果一趟下来没有发生交换,则说明序列有序,可以在序列中设置一个标志flag判断元素是否发生交换,从而来减少不必要的比较(在写完排序算法后再写)小结:一共进行数组大小-1次的外…

使用openssl开源AES算法,实现aes、aes-cbc和aes-ecb对字符串的加解密

注意事项 对于用户输入的密码进行了md5运算&#xff0c;从而保证数据格式的统一性 内部调用的随机函数&#xff0c;参考我的其他博文 参考链接 头文件crypto_util.h #pragma once#include <string>namespace hsm{namespace mgmt{void get_md5_digest(const std::strin…

Android学习指南

目录核心分析内容1、学什么1.1、Android基础 & 常用1.2、Android进阶1.3、与时俱进、热门技术1.4、编程语言&#xff1a;Java与Java虚拟机1.5、计算机基础1.6、总结2、怎么学2.1、学习路径&#xff1a;如何循序渐进、阶段性的学习Android的理论知识&#xff1f;2.2、获取途…

使用memcmp函数判断两个函数的前n位字节数是否相等

memcmp函数的介绍 头文件&#xff1a;#include <string.h>定义函数&#xff1a;int memcmp (const void *s1, const void *s2, size_t n);函数说明&#xff1a;memcmp()用来比较s1 和s2 所指的内存区间前n 个字符。字符串大小的比较是以ASCII 码表上的顺序来决定&#x…

java 选择排序

选择排序–时间复杂度n^2 第一次从arr[0]–arr[n-1]中选出最小值,与arr[0]交换 第二次从arr[1]–arr[n-1]中选出最小值,与arr[1]交换… 最小数:假定当前这个数是最小数,然后和后面的每个数进行比较,当发现有更小的数时,重定最小数与最小数的下标 总结: 选择排序一共有数组大…

Linux环境下实现unsigned char*向string的转换

代码 unsigned char input_data[input_data_length] {"This is my first encrypted plaintext hello world"}; openssl_enc_string hsm::mgmt::aes_ecb_encrypt_to_string(static_cast<string>((const char * )input_data),password);使用static_cast<st…

概率论 事件关系 古典概型与几何概型

基本知识点 随机试验:1.不确定性2.可预知性3.可重复性基本事件:包含一个样本点 必然事件:全集 不可能事件:空集 子集2^n-1-1(减去空集与真集) 事件间的关系 1.包含关系 2.和运算AUBAB,A与B至少有一个发生 3.积事件A∩BAB,AB同时发生 4.差事件A-BAB ̅A-AB,A发生但B不发生 5.…

Android代码命名规范

目录目录1、为什么 规范 Android 代码命名&#xff1f;2、Android需要命名的代码&#xff08;对象&#xff09;有哪些&#xff1f;3、具体命名规范3.1、包3.2、类3.3、变量3.4、方法3.5、参数名3.6、资源3.6.1、布局文件资源3.6.2、图片资源3.6.3、参数值资源3.6.4、动画资源3.…

安卓牛客专项练习2020.12.10

安卓Activity活动 Android的Activity活动中&#xff0c;我们一般可以归结为四种状态: 1.运行状态Running 2.暂停状态Paused 3.停止状态Stopped 4.销毁状态Destroyed 动画Animation 1.补间动画TWeen Animation 其中包括: 平移Translate Animation 透明Alpha Animation 旋转Ro…

将结构体数据存储到一段字符串string中

核心思想 指定一段内存空间存储结构体数据&#xff0c;然后使用一个指针强制类型转化为结构体类型的&#xff0c;就可以使用这个指针操作结构体相关的成员函数和变量结构体内存只会为定义的变量进行分配内存空间&#xff0c;函数只进行调用&#xff0c;不占据空间 结构体 void…

Idea中搭建Resin运行环境(Mac)

一、背景 idea中搭建Resin运行环境&#xff0c;可以在idea中通过点击Run按钮直接调试应用。 二、Resin下载地址 下载地址&#xff1a;https://caucho.com/products/resin/download/gpl#download 我下载的是tar.gz的&#xff0c;通过tar -zxvf命令解压到自己mac的任意目录下…

Java牛客专项练习2020.12.10

TreeSet subset()方法: subset(from,true,to,true),返回从from元素到to元素的一个集合,true判断是否包含边境元素 Java与C Java与C都有三个特征: 封装,继承,多态 抽象类与接口 1.抽象类可以有构造方法,但不能new;接口没有构造方法 2.抽象类中可以有普通成员变量int x等,接…

Idea中搭建Wildfly(JBoss)运行环境(Mac)

目录一、简介二、下载Wildfly&#xff08;JBoss&#xff09;三、配置Idea四、调试一、简介 首先说一下在linux环境&#xff0c;只需要将war包上传到 wildfly-8.2.0.Final/standalone/deployments 目录&#xff0c;然后到 wildfly-8.2.0.Final/bin 目录下 ./standalone.sh&…