出现SocketTimeoutException后一直无法在连接服务器

在做接入sdk功能的时候,经常出现一个问题,内网向外网服务器建立连接并发送数据经常会报SocketTimeoutException这个错误,且一旦出现便大几率再也连不上了。修改之前的代码为:

    public static String httpPost(String url, Map<String, String> paramMap, int timeout)
            throws HttpException, IOException {

        List<NameValuePair> valueList = new ArrayList<NameValuePair>();
        Iterator<String> it = paramMap.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            String value = paramMap.get(key);
            NameValuePair nv = new NameValuePair(key, value);
            valueList.add(nv);
        }

        NameValuePair[] valueArray = valueList.toArray(new NameValuePair[0]);

        String response = null;
        HttpClient client = new HttpClient();
        client.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);

        setTimeout(client, timeout);
        
        PostMethod method = new PostMethod(url);

        method.getParams().setContentCharset("UTF-8");
        method.setRequestBody(valueArray);

        int status = client.executeMethod(method);
        if (status != HttpStatus.SC_OK) {
            return response;
        }

        response = method.getResponseBodyAsString();

        return response;
    }

查了一些资料,试着捕获异常后,清空连接池解决,修改后的代码为:

public static String httpPost(String url, Map<String, String> paramMap, int timeout)
            throws HttpException, IOException {
        String response = " null ";
        HttpClient client = new HttpClient();
        try{
            List<NameValuePair> valueList = new ArrayList<NameValuePair>();
            Iterator<String> it = paramMap.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next();
                String value = paramMap.get(key);
                NameValuePair nv = new NameValuePair(key, value);
                valueList.add(nv);
            }
    
            NameValuePair[] valueArray = valueList.toArray(new NameValuePair[0]);
    

            client.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
    
            setTimeout(client, timeout);
            
            PostMethod method = new PostMethod(url);
    
            method.getParams().setContentCharset("UTF-8");
            method.setRequestBody(valueArray);
    
            int status = client.executeMethod(method);
            if (status != HttpStatus.SC_OK) {
                return response;
            }
    
            byte[] res = method.getResponseBody();//.getResponseBodyAsString();
            response = new String(res);
        }catch(Exception e){
            closeIdleSocket(client);
            throw(e);
        }
        return response;
    }
    
    public static void closeIdleSocket(HttpClient client){
        client.getHttpConnectionManager().closeIdleConnections(50000);
    }
    

目前这样修改之后暂时没有在出现连接超时问题了,但无法确认这个就是根源所在,所以还在持续验证中。

posted @ 2019-11-06 15:13  小堆堆儿  阅读(10632)  评论(0编辑  收藏  举报