当前位置:编程学习 > JAVA >>

在和另一应用通过post传数据时,怎么会偶尔情况下连接不了对方的应用呢?有大虾知道的么?代码如下:

在和另一应用通过post传数据时,怎么会偶尔情况下连接不了对方的应用呢?有大虾知道的么?代码如下:

public class SendPostRequest {

private HttpClient httpClient;
private String url = DefaultParamBean.POSTURL;

public void init() {
this.httpClient = new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
}

// 手机服务端post提交通用接口
public  String sendUrlAndGetResMsg(String params) throws IOException{

init();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(10000);
url = url+"?param="+params;
        //设置代理服务器地址和端口
        //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);

        /*
         * 使用GET方法,提示:如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
         * HttpMethod method = new GetMethod(url);
         */
        
//使用POST方法
        HttpMethod method = new PostMethod(url);
        
        //设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
             new DefaultHttpMethodRetryHandler()); 
        
        //执行 get/post Method
        int statusCode = httpClient.executeMethod(method);
        if (statusCode != HttpStatus.SC_OK) {
            System.err.println("Method failed: " + method.getStatusLine());
        }
        //打印服务器返回的状态
        System.out.println(method.getStatusLine());
        
        byte[] responseBody = method.getResponseBody();
        //打印返回的信息
        String returnUrl = new String(responseBody,"UTF-8");
        //释放连接
        method.releaseConnection();
        return returnUrl;
}
}


提示如下警告:

WARN org.apache.commons.httpclient.HttpMethodBase  - Going to buffer response body of large or unknown size. Using getResponseAsStream instead is recommended.

现在是能访问到另一应用,但时有访问不到的情况,调的越频繁,访问就越是访问不了另一应用.
有谁知道是什么原因呢?帮帮小弟哦. --------------------编程问答-------------------- 容量太大,HttpClient可能处理不了(large or unknown size),所以HttpClient建议你用 getResponseAsStream 而不要用 getResponseBody。 --------------------编程问答-------------------- byte[] responseBody = method.getResponseBody();
这块改成下面的:
byte[] responseBody = method.getResponseAsStream();
这个么?
--------------------编程问答-------------------- No。

因为getResponseBody要求将所有数据读取完毕并缓存在内存中(在这里也就是 byte[])。

而getResponseAsStream是流式操作,如果你尝试过操作磁盘文件的话就不难理解,流式操作可以不需要完整的将所有数据放在内存中。 --------------------编程问答-------------------- 那这块怎么写呢?
能明白些么? --------------------编程问答-------------------- 呃。。。似乎三两句又说不清了,大概是:
Scanner sc = new Scanner(method.getResponseAsStream());
while (sc.hasNext()) {
  String line = sc.nextLine();
  // 处理line。
}


但不过其实有点跑题,我认为你说的问题,跟这个WARN应该关系不大。
问题可能出在服务器端,承受并发压力的能力不足。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,