网络编程

在进行网络编程,文件下载的时候,遇见了以下问题,记录一下,框架使用okHttp3

java.net.SocketException: Socket is closed

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

在有多个服务的系统中,发现如果有别的服务打开过socket链接,在链接服务器不成功的情况下,退出并关闭了socket链接,有可能是我正在使用的端口,×端口有没有可能共享×,或者只要保证【Server IP + Server Port + Client IP + Client Port】这个组合唯一不重复即可。

Exception: Unexpected end of Stream

客户端中读取到的字节为0,考虑服务器中断了,CDN节点切换了等导致网络不畅

java.net.ConnectException: Connection refused

访问服务器给定的地址,链接被拒绝了,考虑服务器暂停了这个服务

总结

使用okHttp框架,添加如下代码也不能进行重试,只能放在try catch里捕捉进行手动重试了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static OkHttpClient getmClient() {
if (mOkHttpClinet == null) {
synchronized (OkHttpClientHelper.class) {
if (mOkHttpClinet == null) {
OkHttpClient.Builder mBuilder = new OkHttpClient.Builder();
mBuilder.sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts());
mBuilder.retryOnConnectionFailure(true);
mBuilder.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().addHeader("Connection", "close").build();
return chain.proceed(request);
}
});
mBuilder.hostnameVerifier(new TrustAllHostnameVerifier());
mOkHttpClinet = mBuilder.build();
}
}
}
LogUtils.d(TAG, "Single OkHttpClient");
return mOkHttpClinet;
}