1

我有一个我想通过套接字发送的对象。对于我得到的输出:

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 对象是可序列化的。

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

有什么建议么?

感谢所有回复

4

1 回答 1

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

于 2013-01-28T14:58:44.097 回答