首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何修复改造中的SSL握手超时

如何修复改造中的SSL握手超时
EN

Stack Overflow用户
提问于 2018-06-21 21:48:24
回答 2查看 17.2K关注 0票数 8

在我的应用程序中,我希望从服务器获取数据,并将其显示在RecyclerView中。

为了从服务器获取数据,我使用了Retrofit2,并编写了以下代码。

但是在一段时间后运行应用程序时,请向我展示E/priceResLog: Err : SSL handshake timed out in onFailure from Retrofit2

我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ApiUtilsPrice {

    private static final String BASE_URL = "https://core.arzws.com/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .build();

        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .client(okHttpClient)
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

活动代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void getCoinData() {
    loaderLayout(true);
    Call<GoldListResponse> call = apiInterface.getGoldPrice();
    call.enqueue(new Callback<GoldListResponse>() {
        @Override
        public void onResponse(Call<GoldListResponse> call, Response<GoldListResponse> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    loaderLayout(false);
                    model.clear();
                    model.addAll(response.body().getGoldBoard());
                    coinAdapter.notifyDataSetChanged();
                    isSendApi = true;
                }
            }
        }

        @Override
        public void onFailure(Call<GoldListResponse> call, Throwable t) {
            Log.e("priceResLog", "Err : " + t.getMessage());
        }
    });
}

我怎么才能修好它?请帮我谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-06-21 22:02:19

添加以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Retrofit getRetrofit(Gson gson) {
            return new Retrofit.Builder()
                    .baseUrl(ZoneApplication.getContext().getString(R.string.feed_data_base_url))
                    .client(HttpClientService.getUnsafeOkHttpClient())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(new NullOnEmptyConverterFactory())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();

        }

或将代码更改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static Retrofit getClient() {

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .build();

        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .client(HttpClientService.getUnsafeOkHttpClient())
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

创建另一个名为HttpClientService的类,并添加以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HttpClientService {
    public static OkHttpClient getUnsafeOkHttpClient() {

        try {
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @SuppressLint("TrustAllX509TrustManager")
                        @Override
                        public void checkClientTrusted(
                                java.security.cert.X509Certificate[] chain,
                                String authType) {
                            //Do nothing
                        }

                        @SuppressLint("TrustAllX509TrustManager")
                        @Override
                        public void checkServerTrusted(
                                java.security.cert.X509Certificate[] chain,
                                String authType) {
                            //Do nothing
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[0];
                        }
                    }};
            final SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts,
                    new java.security.SecureRandom());

            final SSLSocketFactory sslSocketFactory = sslContext
                    .getSocketFactory();

            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .sslSocketFactory(sslSocketFactory)
                    .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
                    .build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
票数 7
EN

Stack Overflow用户

发布于 2018-06-21 22:04:45

将您的ApiUtilsPrice Price替换为以下类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RetroFitSingleton {

private static final String TAG = RetroFitSingleton.class.getSimpleName();
private static final String SERVER_URL = "SERVER_URL/A"; 
private static Retrofit retrofit;
private static RetroInterface retroInterface;


public static RetroInterface getInstance(Activity activity) {
    initializeRetroFit(activity);
    return retroInterface;
}

private static void initializeRetroFit(Activity activity) {
    if (retrofit == null) {
        OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.readTimeout(60, TimeUnit.SECONDS);
        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        httpClient.addInterceptor(logging);
        retrofit = new Retrofit.Builder().client(httpClient.build()).addConverterFactory(GsonConverterFactory.create()).baseUrl(SERVER_URL).client(okHttpClient).build();

        retroInterface = retrofit.create(RetroInterface.class);
    }
} }

将以下文件导入您的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UnsafeOkHttpClient {
public static OkHttpClient getUnsafeOkHttpClient() {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        OkHttpClient okHttpClient = builder.build();
        return okHttpClient;
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50981413

复制
相关文章
博客换回默认主题
看到过不少很炫酷的个人网站 自己也写了几个 typecho 主题 越来越觉得搞那些花里胡哨的卵用没得 还是要生产内容才是王道
eallion
2022/12/20
2780
把 Incoming Links 换回 technorati
在早前测试 WordPress 2.3 Beta 版本的时候!就对把 Incoming Links 换成 Google Blog Search 感觉不爽,感觉目前 Google Blog Search 除了显示自己的链接之外,别的就没有搜索过了,都不知道干吗去了!还是 technorati 好。
Denis
2023/04/13
2450
前端如何优雅切图
前端切图历史悠久,或许那时候不叫前端,叫页面重构师。之所以页面重构师要自己动手切图,是因为面对多种多样的页面效果,UI设计师不知道每一张图的需求,常常会引发流血冲突,带来不可挽回的生命危险。 切图能体现页面重构师的经验和能力,如果你拿到手的是psd文件,那么你可以看看“存储为 Web 和设备所用格式”的切法。
疯狂的技术宅
2019/03/28
9520
前端如何优雅切图
如何评估活动效果?
答:推广渠道的曝光量增加了30%、落地页面点击率70%、活动期间有6万用户参与……(此处省略各种指标)。
猴子数据分析
2021/01/09
1.4K0
如何评估活动效果?
答:推广渠道的曝光量增加了30%、落地页面点击率70%、活动期间有6万用户参与……(此处省略各种指标)。
猴子数据分析
2020/10/21
8070
如何提升TPM活动的成功概率?
TPM的实践需要全员参与,因此在开始TPM活动之前,需要建立共识并向全员解释TPM的目的和优点。这有助于员工理解TPM的价值,增强他们对TPM的支持度,并使TPM的实践更加顺利。
用户9972271
2023/04/25
3140
如何使用Aced分析活动目录的DACL
Aced是一款针对活动目录的安全检测与分析工具,该工具可以帮助广大研究人员解析单个目标活动目录的DACL。Aced可以针对目标帐户识别可疑的入站访问权限,解析入站权限的SID,并将该数据呈现给研究人员。除此之外,Aced还整合了pyldapsearch工具的日志记录功能,可以在本地记录目标主体的LDAP属性,而pyldapsearch的配套工具BOFHound可以对这些属性进行解析,随后我们可以将收集到的数据导入到BloodHound中进行后续操作。
FB客服
2022/11/14
6240
如何使用Aced分析活动目录的DACL
WordPress 不想用 CDN 了,如何替换回服务器本地图片?
我们继续来解答 WPJAM Basic 插件「CDN 加速」功能的常见问题,今天是一个反向操作的问题,不想用 CDN 之后如何替换回服务器本地图片?
Denis
2023/04/13
8250
WordPress 不想用 CDN 了,如何替换回服务器本地图片?
如何衡量品牌活动的有效性?
译者:李晓艳 本文长度为1313字,预估阅读时间3分钟。 摘要:本文作者介绍了从线上品牌调查、查看“浏览率”两种途径衡量品牌活动的有效性。 在之前的文章(https://www.dialogtech.com/blog/blog/a-quick-guide-to-measuring-online-lead-gen-success)中我谈到营销人员如何决定运行哪类活动(线索主导或品牌),并专门研究了线索主导活动成功与否的衡量方法。 现在深入研究品牌活动,并且介绍一下如何评估品牌活动的成功。 什么是品牌活动? 表
iCDO互联网数据官
2018/03/05
1.9K0
[Go] 利用类型断言把interface{}的转换回原类型
当传参数的时候 ,为了方便 ,参数的类型定义成了interface{} , 如果要给这个原类型的属性赋值 , 就需要强转回去
唯一Chat
2020/05/26
6520
如何实现黑幕?即鼠标触及之地,原来黑色显示原来文字
最近在写文章时,有些比较敏感的句段想实现默认情况下黑色(遮住文字),而鼠标靠近之后显示出来这些敏感句段的功能。
可定
2020/05/07
2.8K0
如何实现黑幕?即鼠标触及之地,原来黑色显示原来文字
如何利用Photoshop进行快速切图
在UI设计中我们常常使用Ai来进行矢量图的绘制,然后导入Ps中进行设计、排版和导出。 
奔跑的小鹿
2019/01/24
9910
如何利用Photoshop进行快速切图
Mastercam如何设定车床切槽刀?
当设定好图形及刀具型式,再来就可以设定参数的部分,可依参数去设定。 1、设定刀具: 请依架刀位置、刀座、主轴及选转方向设定,完成后打勾。 刀补类型 刀具间隙: 设定前角间隙宽度及侧角间隙高度。 设定宽度,让系统知道您刀片的宽度。 可点两弧来选择,选择黄色亮显的圆弧。 在宽度下方会显示设定刀片的宽度。 显示刀具:设定好后可以点选显示刀具来确认,如下图。 可看到刀片R角,有完整的圆,这样代表设定正确。打勾这样刀具就建立好了。
lrglu
2022/03/30
1.5K0
Mastercam如何设定车床切槽刀?
中文被 json_encode 编码成 unicode 之后如何转换回中文
使用 php 自带的 json_encode 函数对数据进行编码时,中文都会变成 unicode,前面我介绍了如何使得中文不被 json_encode 不编码成 unicode。
Denis
2023/04/14
1.1K0
ERP系统如何提升模切企业的管理效率
区别于其他行业,模切制造业的模切料分切后规格繁多,呆滞料无法及时处理等问题,传统ERP系统根本无法满足模切企业的实际业务需求,如何选择到适合模切企业的ERP系统就显得尤为关键。
用户7772535
2022/04/24
4420
如何把新版Chrome的界面切回经典样式
// 我们知道,Edge 的唯一作用是下载 Chrome,这行注释了,你们是程序员应该看不到的
Edi Wang
2019/07/10
2.1K0
如何把新版Chrome的界面切回经典样式
掌握如何使用Rose绘制活动图的方法[通俗易懂]
1.案例:借鉴我校图书管理系统,根据图书信息入库、借阅、归还、检索等活动流程,分析相关活动需求和活动到活动变化,使用rational rose绘制图书管理系统中某个活动流程的一个完整过程的活动图。
全栈程序员站长
2022/08/24
4.1K0
掌握如何使用Rose绘制活动图的方法[通俗易懂]
js全局替换回车换行符
但是保存的时候不能把回车换行符保存进数据库呀,所以在保存之前要再次把回车换行符替换没了,发现用js替换\r\n无效,思考了一下,可能是html显示是自动过滤了\r,而以\n来显示吧。于是把替换代码改成:
全栈程序员站长
2022/08/31
12.3K0
js全局替换回车换行符
pycharm如何打开原来的项目_terminal怎么打开
Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图)
全栈程序员站长
2022/09/27
3K0
pycharm如何打开原来的项目_terminal怎么打开
点击加载更多

相似问题

用于动态数据的mat表分页器和排序问题

220

Mat分页器更改工具提示位置

30

当mat表位于NgIf内部时,mat分页器中断

60

mat分页器不显示页面信息。

310

mat-分页器宽度与mat-table不对齐

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文