【问题标题】:Sending compressed data via socket通过套接字发送压缩数据
【发布时间】:2010-06-16 09:37:39
【问题描述】:

我必须在java中制作一个日志服务器,其中一项任务是发送压缩的数据。现在我以纯文本逐行发送它,但我必须压缩它。 服务器处理“HTTP like”请求。例如,我可以得到一个发送“GET xxx.log”的日志。这将建立与服务器的 TCP 连接、带有标头和日志的服务器响应,并关闭连接。客户端逐行读取并分析每个 LOG 条目。 我尝试了一些方法没有成功。 我的主要问题是我不知道每行的结束位置(在客户端大小中)。 有什么想法吗?

【问题讨论】:

    标签: java sockets compression


    【解决方案1】:

    在服务器端使用 GZIPOutputStream,在客户端使用 GZIPInputStream,并使用 InputStreamReader 和 BufferedReader。然后只需阅读行。

    【讨论】:

    • 我试过了,但是当我尝试 readline() 时,它会抛出这个异常:java.io.EOFException: Unexpected end of ZLIB input stream
    • 那么,如果您在新问题中粘贴重现代码示例可能会很好。流确实是一个很好的方法。
    【解决方案2】:

    最有意义的事情是这样的

    1. 客户端发送 GET foo.log
    2. 服务器发送“大小:15042\n”
    3. 服务器发送整个压缩日志文件
    4. 客户端解析 Size: 标头(读取到换行符)然后知道需要多少字节
    5. 客户端然后从服务器读取所有这些字节(示例中为 15042)
    6. 客户端解压接收到的数据
    7. 客户端然后处理日志(解压后你会发现换行符)

    【讨论】:

    • 这对我不起作用,因为我想尽快处理行(日志文件可能非常大)
    • 然后分块执行,以 Size 字节为单位重复步骤 3 到 6
    【解决方案3】:

    您可以查看 HTTP Range 标头。客户端可以请求一定范围的字节,而服务器将只返回这些字节。使用 GZIP 压缩。

    在请求部分日志之前,您可以从客户端调用一个操作,该操作将提供一个带有字节范围的索引。

    HTTP 标头有很多开销,因此您可以考虑一次发送 100 行或更多行。

    最后,看看分块传输编码,它允许您将数据流式传输到客户端。

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多