如何阅读GZIP Object输入,Java

时间:2013-01-28 14:53:59

标签: java object client gzipoutputstream

我有一个Object,我想通过Socket发送。 对于我得到的输出:

Socket s = serverSocket.accept();
ObjectOutputStream dout = new ObjectOutputStream(new GZIPOutputStream(s.getOutputStream()));
Msg m = new Msg("123", "123", karte);
dout.writeObject(m);
dout.reset(); //No I don't want to chache it

对于我得到的输入:

Socket s = new Socket(host, port);
ObjectInputStream din = new ObjectInputStream(new GZIPInputStream(s.getInputStream()));
Msg m = (Msg)din.readObject();

Msg对象是Serializableable。

如果我运行此代码,我得到客户端连接,服务器也发送数据,但客户端永远不会开始读取输入

有什么建议吗?

感谢所有回复

1 个答案:

答案 0 :(得分:2)

也许在调用reset()之前刷新输出流?

哦,是的,另外一件事,你可能需要先关闭GZIP输出,我相信它不会在调用close()之前完成gzip流。在这种情况下,您可能必须关闭整个流堆栈,然后重新打开它。也许考虑单独处理压缩并仅将结果推送到输出流?

一些示例代码:

Socket s = serverSocket.accept();
ByteArrayOutputStream compressed = new ByteArrayOutputStream();
GZIPOutputStream compressor = new GZIPOutputStream(compressed);

Msg m = new Msg("123", "123", karte);
m.writeObject (compressor);
compressor.close();

OutputStream fout = s.getOutputStream();
fout.write (compressed.toByteArray() );
fout.close ();

如果你无法关闭流,它会变得有点棘手。 如果服务器没有关闭流,你就不会得到EOS信号。这意味着你必须在缓冲区中累积传入的字节(ByteArrayOutputStream很方便),并在进入某些结束序列时手动扫描字节,所以你知道何时停止阅读并开始反序列化。

上面的代码当然没有保证......:p