为什么http post在android上失败超过3g?

时间:2014-10-14 19:39:25

标签: android http post 3g

我有一个Android应用程序向包含一些NameValuePairs的服务器发出HTTP发布请求,并且它可以在任何wifi网络上正常工作,但是当我使用相同的http帖子超过3g时,服务器获取一个http请求空虚的身体。这是请求的代码

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    3);
            nameValuePairs.add(new BasicNameValuePair("Name", params[0]));
            nameValuePairs.add(new BasicNameValuePair("DNI", params[1]));
            nameValuePairs.add(new BasicNameValuePair("Token", params[2]));

            URL url = new URL(URL_SERVER);
            HttpURLConnection conn = (HttpURLConnection) url
                    .openConnection();
            conn.setReadTimeout(30000);
            conn.setConnectTimeout(50000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getQuery(nameValuePairs));
            writer.flush();
            writer.close();
            os.close();

            conn.connect();
            int responseCode = conn.getResponseCode();
            BufferedReader in;
            if (responseCode == 404)
                in = new BufferedReader(new InputStreamReader(
                        conn.getErrorStream()));
            else
                in = new BufferedReader(new InputStreamReader(
                        conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

以下是getQuery方法的代码

private String getQuery(List<NameValuePair> params)
        throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}

知道为什么会这样吗?

我有新信息。我做了一个表格,通过网络浏览器发送http帖子。这种形式非常有效,可以在Windows手机和wifi上完美地传输超过3g的身体。但是,当我尝试使用超过3g的Android手机的Chrome发送http帖子时,它会变空,如果我尝试从连接到我的Android手机的热点的一台计算机发送http帖子,它也会失败。当我尝试使用连接到wifi网络的同一台计算机时,没有任何问题。这太奇怪了。想法?

2 个答案:

答案 0 :(得分:0)

我的建议是使用Google的Volley库进行联网。在Android上进行网络连接时,它几乎是目前最好的选择。这真的不应该是3G问题。如果是,您的问题可能是孤立的。

在这里你可以看一些资源(凌空很容易使用):

https://developers.google.com/events/io/sessions/325304728 https://developer.android.com/training/volley/index.html

答案 1 :(得分:0)

解决了,问题是服务器没有正确读取有多个tcp数据报的请求,看起来像android拆分tcp数据报超过3g