Rumah > Soal Jawab > teks badan
现在项目上有这么个需求,客户拿着APP去一个深山老林里(或者去一个偏僻的村庄)去和核查情况,网络情况不是很好,有可能是2G网络 也有可能时刻断网,但是他要通过APP与服务器交互了,首先是登录就要与服务器交互,然后紧接着获取一些核查规则来查看,这些都是返回的json字符串,手机端进行解析,但是这种弱网络情况请求应该会很慢很慢吧,有没有一种方式能够变快呢? 我查阅了一些资料,网上说:服务端通过将数据压缩后然后传递给客户端,客户端在进行解压,在解析json并展示···· 哪位大神遇到过这种需求。求给个思路。谢谢!
伊谢尔伦2017-04-18 10:32:03
可以采用Gzip压缩,缩小请求数据的大小,提高网络传输速度。
使用gzip,首先要设置请求消息头Accept-Encoding为gzip。这样,你将会得到一个响应,根据消息头Content-Encoding为gzip你可以知道,传输过来的数据是经过gzip压缩的。另外,消息头Content-Length会告诉你压缩后的数据长度。
客户端
GetMethod method = new GetMethod(url);//生成一个get方法实例
method.setQueryString(queryString);//设置查询字符串
method.addRequestHeader("Accept-Encoding", "gzip");//设置接受响应消息为gzip
HttpClient client = new HttpClient();//生成执行get方法的客户端实例
client.executeMethod(method);//执行get方法
InputStream in = method.getResponseBodyAsStream();//获取响应消息体
Header contentEncoding = method.getResponseHeader("Content-Encoding");//获取消息头Content-Encoding判断数据流是否gzip压缩过
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
GZIPInputStream gzipIn = new GZIPInputStream(in);
int len = Integer.parseInt(method.getResponseHeader("Content-Length").getValue());
byte[] b = new byte[len];
gzipIn.read(b);
String json = new String(b);
System.out.println(json);
}
服务端
byte[] result = data.getBytes("UTF-8");
if(response.getHeader("Accept-Encoding").equalsIgnoreCase("gzip"))
{
// System.out.println("Before compression, the data size is :"+ result.length);
// Using gzip compress the data
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(out);
gout.write(json.getBytes("UTF-8"));
gout.close();
result = out.toByteArray();
// System.out.println("After compression, the data size is "+gzipResult.length);
this.getResp().setHeader("Content-Encoding","gzip");
this.getResp().setHeader("Content-Length", result.length+"");
}
response.getOutputStream().write(result);
黄舟2017-04-18 10:32:03
Mampatan data digunakan untuk mengurangkan jumlah penghantaran data Ia boleh meningkatkan kelajuan di bawah rangkaian yang lemah, tetapi ia akan menjadi sia-sia tanpa rangkaian. Adakah mungkin untuk membuat model ramalan dan meramalkan pra-penghantaran kandungan permintaan dalam tempoh masa seterusnya berdasarkan parameter berkaitan yang disediakan oleh apl?
怪我咯2017-04-18 10:32:03
Cache permintaan terakhir Pelayan hanya akan menghantar kandungan yang diubah dalam keadaan rangkaian yang lemah, dan memasukkan kandungan yang diubah ke dalam cache terakhir untuk paparan. Rangkaian ini adalah yang paling menjimatkan.
黄舟2017-04-18 10:32:03
Caching data, data yang diminta boleh dicache secara tempatan untuk paparan data Data yang perlu dimuat naik juga boleh dicache secara tempatan terlebih dahulu dan dihantar apabila isyarat rangkaian baik. Tunggu penyambungan semula gagal,
高洛峰2017-04-18 10:32:03
Mampatan diperlukan untuk meningkatkan kecekapan penghantaran rangkaian dan memendekkan masa interaksi permintaan sebanyak mungkin.
Juga beri perhatian untuk mengelakkan penyerahan pendua. (Menjamin hilang pucuk beberapa antara muka)
迷茫2017-04-18 10:32:03
Rangkaian yang lemah bermakna terdapat rangkaian Selagi anda memastikan rangkaian sentiasa disambungkan sebelum pelayan bertindak balas, ia akan menjadi mudah untuk diselesaikan tiada kawan. Mampatkan sebanyak mungkin... setelah menerima jawapan Hanya huraikan pada klien.
PHP中文网2017-04-18 10:32:03
Caching data diperlukan untuk memastikan data sebelumnya dipaparkan pada halaman sebelum data baharu diperolehi dicache untuk mengelakkan permintaan rangkaian berulang disebut di atas
阿神2017-04-18 10:32:03
Gunakan xml untuk memindahkan data, menyimpannya secara setempat dan memaparkan data setempat apabila tiada sambungan rangkaian
黄舟2017-04-18 10:32:03
SQLite menyimpan sebahagian daripada data sensitif disingkatkan sebagai panjang parameter Tentukan sama ada terdapat nilai pulangan daripada http dan kemudian hantarkannya semula