有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何减少向远程服务器发送数据的时间?

例如,我的平板电脑中存储了10MB的数据。数据具有列表结构。列表中的每个条目约为3500字节

目前,我每次发送一条带有以下代码的条目:

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(ipport+ phpHandler);
    HttpResponse response = null;

    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
        response = httpclient.execute(httppost);
    } catch (UnsupportedEncodingException e) {
    } catch (ClientProtocolException e) {
    } catch (IOException e) {
    }

但是要发送这个10MB的数据,需要很长时间。每次发送条目大约需要1秒的时间

有什么办法可以提高效率


共 (2) 个答案

  1. # 1 楼答案

    我同意“艾哈迈德”的回答。最好使用jSON字符串对象,然后使用gzip库进行压缩

    对于JSON,有很多有用的教程。下面的链接非常有用

    http://www.vogella.com/articles/AndroidJSON/article.html

    在这里,您可以看到编写json的简单方法

    public void writeJSON() {
      JSONObject object = new JSONObject();
      try {
        object.put("name", "Jack Hack");
        object.put("score", new Integer(200));
        object.put("current", new Double(152.32));
        object.put("nickname", "Hacker");
      } catch (JSONException e) {
        e.printStackTrace();
      }
    } 
    

    为了使用gzip进行压缩和解压缩,我在这里添加了一些来自答案https://stackoverflow.com/a/6718707/931982的示例代码

    public static byte[] compress(String string) throws IOException {
        ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());
        GZIPOutputStream gos = new GZIPOutputStream(os);
        gos.write(string.getBytes());
        gos.close();
        byte[] compressed = os.toByteArray();
        os.close();
        return compressed;
    }
    
    public static String decompress(byte[] compressed) throws IOException {
        final int BUFFER_SIZE = 32;
        ByteArrayInputStream is = new ByteArrayInputStream(compressed);
        GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
        StringBuilder string = new StringBuilder();
        byte[] data = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = gis.read(data)) != -1) {
            string.append(new String(data, 0, bytesRead));
        }
        gis.close();
        is.close();
        return string.toString();
    }
    
  2. # 2 楼答案

    您可以构建一个包含所有实体的JSON字符串对象,然后使用gzip或任何其他压缩方案对其进行压缩

    构建JSON对象的好处是可以将所有对象作为一个请求传输,而不是单独发送。这将消除每次建立新连接的延迟

    // your data list = listData
    JSONArray newArray = new JSONArray();
    for (int i = 0, lsize = listData.size(); i < lsize; i++) {
        try {
            newArray.put(i, listData.get(i));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    

    这段代码将使用listData中的所有元素构建一个JSONArray(它应该是一个字符串列表)

    现在,您可以使用

    newArray.toString()
    

    现在,您可以通过网络发送此JSON字符串,并且可以轻松地用任何服务器端语言反序列化JSON对象

    至于Gzip压缩,您可能想看看这个link

    这里有一个关于在android中通过HTTP发送GZip压缩数据的问题
    GZip POST request with HTTPClient in Java