栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

java.net.SocketException: Connection reset 码匠笔记的论坛实战项目,使用access

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java.net.SocketException: Connection reset 码匠笔记的论坛实战项目,使用access

关于 okhttp 的 java.net.SocketException: Connection reset异常

使用OkHttp过程出现java.net.SocketException: Connection reset 异常。我个人觉得okhttp时好时坏,使用它的api有时候能够登录GitHub成功,有时候一直登录失败,报此Connection reset 异常。具体原因我也不清楚,这个网络上有相关文章。但是GitHub应该做了相关的处理,如果你在一段时间内频繁访问它的api网站,它会给你拒绝连接,就好比抵制恶意攻击,我换用这个HttpClient后,至少比原来的okhttp方式好一些,十次能有8次成功。所以最好的方式就是换掉它。

换什么呢? 当然是更稳定的技术,我查询了一下,发现的它的同类技术,叫HttpClient就相对稳定。 解决方法如下

1.在pom文件中引入HttpClient需要的依赖

       
        
        
            org.apache.httpcomponents
            httpcore
            4.4.10
        
        
        
            org.apache.httpcomponents
            httpclient
            4.5.6
        

  1. 代码改写如下:
    因为我这里出问题的只有这个函数,所以就改写了这一块的代码,测试后再也没出现reset异常。这里还顺便解决了token不能作为参数查询的问题,GitHub好像2020年马上就不会支持这种方式了,所以应该把这个token放到header中去。
public GithubUser getUser(String accessToken) throws Exception {
        int timeout = 60;
        RequestConfig defaultRequestConfig = RequestConfig.custom()
                .setSocketTimeout(timeout * 1000)
                .setConnectTimeout(timeout * 1000)
                .setConnectionRequestTimeout(timeout * 1000)
                .build();
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpGet httpget = new HttpGet("https://api.github.com/user");
        httpget.addHeader(new BasicHeader("Authorization", "token "+accessToken));
        httpget.setProtocolVersion(HttpVersion.HTTP_1_0);
        httpget.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
        httpget.setConfig(defaultRequestConfig);
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            GithubUser user = JSON.parseObject(entity.getContent(),GithubUser.class);
            EntityUtils.consume(entity);
            response.close();
            return  user;
        } catch (Exception e){
            throw e;
        } finally{
            if(response != null){
                response.close();
            }
            if(httpclient!=null){
                httpclient.close();
            }
        }
    }
一些个人想法和建议

到获取用户信息这一环节,前面的环节都没问题,但是到获取用户信息这一步就经常出现reset异常。这个也是一种变相保护。也有可能是需要返回的用户数据有点多。尽量还是少登录退出着玩。这个bug困扰了很久,也解决不了。实在不行,还有办法,最下策,换多个GitHub账号,你多用几个邮箱注册,那账号就多了,可以这个号被reset就换下一个登录。它GitHub总不能把所有号都reset。每个号怎么也得给个5到6次机会。事实上也是这样,我就弄了两个邮箱注册的GitHub。至少调试这个项目是够了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909937.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号