最近几天,我尝试使用能够接受TLS连接的套接字连接到服务器。 (TLSv1.2工作)
我有自定义TLSSocketFactory在Android设备上启用TLSv1.2> 16 我有验证服务器证书的代码(自签名服务器证书) - 它是一个众所周知的自定义SSLSocketFactory等...这一切都很好,但问题是当我尝试连接到服务器时 - 我得到了SocketTimeoutException
构建OkHttpClient和Retrofit的代码(使用匕首):
"fabc",3000.0,1
"fdef",3650.0,1
"ghi",3000.0,2
服务器示例地址: air.sample.com ,端口: 2559 我的改造基本网址如下:https://air.sample.com:2559
我的UserService界面:
@Provides
@Singleton
HttpLoggingInterceptor provideHttpLoggingInterceptor() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return interceptor;
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Context context, Integer connTimeout, HttpLoggingInterceptor loggingInterceptor) {
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
httpBuilder.addInterceptor(loggingInterceptor);
httpBuilder.connectTimeout(connTimeout, TimeUnit.SECONDS);
httpBuilder.readTimeout(0, TimeUnit.NANOSECONDS);
try {
TLSSocketFactory tlsSocketFactory = new TLSSocketFactory(context);
httpBuilder.sslSocketFactory(tlsSocketFactory, tlsSocketFactory.systemDefaultTrustManager());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
LogHelper.printLogMsg("Failed to create Socket connection ");
e.printStackTrace();
}
return httpBuilder.build();
}
@Provides
@Singleton
UserService provideUserService(String baseUrl, OkHttpClient httpClient) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.addConverterFactory(ProtoConverterFactory.create())
.build();
return retrofit.create(UserService.class);
}
}
首先:我不确定改装@Body注释是否正确,因为我无法访问服务器而且没有文档。
问题是当我尝试将数据发送到服务器时,我收到了SocketTimeoutException:
public interface UserService {
@POST("./")
Call<Protos.LoginResponse> requestUserLogin(@Body Protos.LoginRequest loginRequest);
如果我尝试从基本网址中删除“https://”,我会收到一个例外:非法网址... 如果有人知道如何解决这个问题,请告诉我解决方案。另外,我编写了简单的python脚本,使用Socket连接到服务器(服务器地址没有'https://':'air.sample.com'),效果很好,所以问题出现在我的代码中,但我可以'弄明白了。