2010-06-16 76 views
1

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

回答

1

,将最有意义的事情是这样的

  1. 客户端发送GET foo.log
  2. 服务器发送“面积:15042 \ N”
  3. 服务器发送的压缩档,整个
  4. 客户端分析大小:头(读取直到换行符),然后知道有多少字节预计
  5. 然后客户端从服务器读取所有这些字节(在本例中为15042)
  6. 客户端解压接收到的数据
  7. 客户端,然后处理
+0

这对我不起作用,因为我想尽可能快地处理行(日志文件可以非常大) – Pizza 2010-06-16 04:05:29

+0

然后以块的形式执行,重复步骤3到6的大小字节块 – 2010-06-16 06:39:32

0

您不妨来看看在HTTP范围头日志(解压缩,你会发现新行)。客户端可以请求一个字节范围,服务器将只返回那些字节。使用GZIP压缩。

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

HTTP头有很多开销,所以你可能会考虑一次发送100行或更多。

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

3

在服务器端使用GZIPOutputStream,在客户端使用GZIPInputStream,并在其周围有一个InputStreamReader和一个BufferedReader。然后只读线条。

+0

我试过了,但是当我尝试使用readline()时,它会抛出以下异常: java.io.EOFException:ZLIB输入流的意外结束 – Pizza 2010-06-16 04:03:07

+2

然后,如果您在新问题中粘贴了重现代码示例,可能会很好。流是一个很好的方式来做到这一点。 – 2010-06-16 07:08:41