2011-05-08 95 views
3

我有一个客户端 - 服务器应用程序,服务器在每次新客户端套接字加入时向所有客户端发送所有客户端的列表。问题是,当一个新客户加入时会得到正确的列表,但旧客户在加入时会得到旧列表。 有点像他们每次都从输入流中获取同一对象。Java输入流缓冲区对象?

我可以以某种方式刷新输入流吗?

阅读对象:

while((inObject = in.readObject()) != null) { 
    ... 
} 

发送对象:

out.writeObject(object); 
+0

客户正在获取您要发送的内容。他们不是“从输入流中取得同一个对象”。您需要修复,但是由于您没有发送正确的数据,因此您需要发送清单。 – 2011-05-08 19:08:01

+0

重置做了工作:) – 2011-05-08 19:13:57

+1

ObjectOutputStream.reset()是在这里下面的答案,但BTW您的循环终止条件可能是错误的。如果你写了一个null,ObjectInputStream.readObject()只返回null。在EOS中,它抛出一个EOFException。 – EJP 2011-05-09 01:36:36

回答

5

ObjectOutputStream.reset()是你在找什么。

它也可以防止你的内存不足,否则可能会发生。原因是ObjectInput/OutputStream类缓存通过它们发送的所有对象,这也阻止了这些对象被垃圾收集。这对于处理循环引用是必需的,并且还可以在多次发送对象时提高性能。

2

我怀疑的问题是,您要修改现有的对象,然后重用现有ObjectOutputStream。拨打电话resetObjectOutputStream可以有效地清除其对潜在修改对象的引用缓存。