【问题标题】:JSON Data Compression for HTTP PostHTTP Post 的 JSON 数据压缩
【发布时间】:2015-09-25 17:10:54
【问题描述】:

我有一个将实时数据发送到 PHP 服务器的 android 应用程序。数据采用 JSON 格式,并以 HTTP POST 请求从 Android 应用程序发送到 PHP。发送的数据非常大,达到 11KB。我需要每 2 秒发送 11 KB 的此类信息,持续 1 周。这导致了两个问题:

  1. 数据非常大,通过蜂窝网络发送。因此,事实证明这是一项相当昂贵的操作。
  2. 将这 11 KB 的信息从应用程序传输到服务器需要很长时间。从而延迟后续的 POST 请求,从而使整个数据传输非常非常缓慢。

我们考虑过使用 Web 套接字和协议缓冲区作为替代方案。这些选项的问题是我们需要更改代码的整个结构。

是否有任何其他选项可以帮助减少数据(例如显着压缩数据),以便通过蜂窝网络传输的数据消耗更少的空间并且可以更快地完成?我也读过关于 gson、bson 等的文章,但我不相信它们在当前 json 结构中的效率。

【问题讨论】:

  • 你用的是什么http客户端?如果支持gzip 压缩,您可以启用它(某些客户端默认使用它 afaik)
  • 这是 11K 的全新数据,还是只是重复了一些相同的内容,只是做了一些更改
  • 我在 Android 中使用 HTTPURLConnection。据说默认会压缩数据,但这并不足以满足我们的要求。
  • @RiggsFolly:它的全新数据。
  • 用sockets代替http怎么样?

标签: php android json


【解决方案1】:

可以使用 HTTP 协议压缩 post 数据:

  1. 根据您使用的 HTTP 客户端,您可能必须自己压缩内容。使用 JDK 7 提供的GZIPOutputStream 很容易做到这一点。

  2. 在客户端,您需要提供以下 HTTP 请求标头:

    • Content-Encoding: gzip
    • Content-Length: X,其中 X 是 entity body 压缩后的字节大小。
  3. 数据必须在服务器上解码,这通常使用mod_deflate 来完成。


但是,我认为压缩不会有太大帮助。通过蜂窝网络传输 11 KB 的信息不会比传输 11 个字节的信息花费更长的时间。问题出在 ping(和 HTTP 协议)上。

我建议使用persistent HTTP connection,这样可以通过保持连接打开来缩短传输时间。


但是您肯定会更好地使用 web-sockets 和二进制序列化。 Web-sockets 使用开销少得多的持久连接,这导致连接延迟非常低。

【讨论】:

  • 谢谢蒂姆。尽管我已经多次遇到这个建议,但我仍然不清楚 websockets 将如何帮助我解决问题。您能否指出一些资源来帮助我了解 Web 套接字将如何帮助我?
  • Websockets与服务器保持打开连接,一个Http请求,会先打开一个socket,发送数据,然后再次关闭socket,打开一个socket的行为需要时间,用Websockets您可以保持打开的套接字到服务器并连续发送数据(就像在写入/读取文件时打开输入或输出流一样)
  • @user3855126 Web-sockets 使用持久连接,开销少得多,这导致连接延迟非常低。信息可以以二进制格式发送,例如比 JSON 小很多。
  • 感谢 Daniel 和 Tim 的解释。使用安卓手机的网络套接字是否安全?
  • @Tim:非常感谢您为我解惑。接受您对建议 Web 套接字和二进制序列化的回答。
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2012-10-13
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多