16

我正在使用移动设备上的 Java ME 应用程序与 Tomcat 服务器通信。
我想知道是否可以使用 Gzip 压缩我的请求/响应以减少通过网络发送的字节数。

4

4 回答 4

18

现代手机的 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"
... />
于 2009-09-20T03:16:39.997 回答
4

您可以压缩 HTTP 请求或响应的内容,但不能压缩标头。请参阅 HTTP 1.1 规范的第 3.6 节,以及后面描述 Content-Encoding 标头的部分。

编辑:另一方面,不能保证 HTTP 服务器端将接受任何特定的压缩格式。并且根据 HTTP 的服务器端实现的质量,它甚至可能无法识别请求内容已被压缩。因此,除非您知道服务器端支持压缩请求内容,否则您不想这样做。

于 2009-09-20T02:55:14.963 回答
2

由于您使用的是 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 站点上找到有关如何执行此操作的一些指示。

于 2009-09-20T02:54:31.097 回答
1

在服务器端,您可以按照此处所述启用它,但移动应用程序需要一个可以解压缩 gzip 的库,例如这个。可能需要一些工作才能让它工作......

于 2009-09-20T02:52:58.073 回答