我正在使用移动设备上的 Java ME 应用程序与 Tomcat 服务器通信。
我想知道是否可以使用 Gzip 压缩我的请求/响应以减少通过网络发送的字节数。
4 回答
现代手机的 CPU 能力如此之强,网络速度相对较慢,因此压缩非常有意义。这也很容易做到。
在 J2ME 方面,您可以执行以下操作(假设您使用 HttpConnection),
hc.setRequestProperty("Accept-Encoding", "gzip, deflate");
if (hc.getResponseCode() == HttpConnection.HTTP_OK) {
InputStream in = hc.openInputStream();
if ("gzip".equals(hc.getEncoding()))
in = new GZIPInputStream(in);
...
我们使用来自 tinyline 的 GZIPInputStream 但我相信还有其他的,
http://www.tinyline.com/utils/index.html
在服务器端,它都是内置的。只需在 Tomcat 的 server.xml 中的 Connector 中添加以下属性,
<Connector
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,application/json"
... />
您可以压缩 HTTP 请求或响应的内容,但不能压缩标头。请参阅 HTTP 1.1 规范的第 3.6 节,以及后面描述 Content-Encoding 标头的部分。
编辑:另一方面,不能保证 HTTP 服务器端将接受任何特定的压缩格式。并且根据 HTTP 的服务器端实现的质量,它甚至可能无法识别请求内容已被压缩。因此,除非您知道服务器端支持压缩请求内容,否则您不想这样做。
由于您使用的是 Tomcat,因此请考虑将 Apache HTTP Server 实例放在 Tomcat 服务器前面的可能性。
这可以使用Apache HTTP Server的mod_jk模块来完成。完成后,您可以在 Apache中使用mod_gzip / mod_deflate 。
当然,您的客户端应该能够处理压缩响应,这样才能正常工作。如果您强制您的客户端使用压缩响应,则客户端最终会显示乱码,因为它本来(通常)会期待纯文本响应。您将在客户端的 Accept-Encoding 标头中找到客户端处理压缩响应的能力的明确指标。
如果您想避免在网络中引入 Apache HTTP 服务器,可以使用写入 ZipOutputStream 或 GZipOutputStream 的 servlet 或 servlet 过滤器以编程方式完成。您可以在 OReilly OnJava.com 站点上找到有关如何执行此操作的一些指示。