我的项目由两个部分组成:服务器端和客户端。当我启动服务器端时,一切都正常,但是当我不时地启动客户端时,我会得到以下错误:
java.io.IOException: stream active
at java.io.ObjectOutputStream.reset(Unknown Source)
at client.side.TcpConnection.sendUpdatedVersion(TcpConnection.java:77)
at client.side.Main.sendCharacter(Main.java:167)
at client.side.Main.start(Main.java:121)
at client.side.Main.main(Main.java:60)当我试图在另一台pc上运行这个项目时,这个错误发生得更频繁。在Java文档中,我找到了这一点。
在序列化对象时,可能不会调用重置。如果调用不当,将引发IOException。
这是抛出错误的函数。
void sendUpdatedVersion(CharacterControlData data) {
try {
ServerMessage msg = new ServerMessage(SEND_MAIN_CHARACTER);
msg.setCharacterData(data);
oos.writeObject(msg);
oos.reset();
} catch (IOException e) {
e.printStackTrace();
}
}我试着把冲水()放上去,但没什么用。有什么想法吗?此外,服务器端没有错误。
发布于 2014-11-23 13:31:27
我想你误解了reset()的工作。它重置流以忽略以前写入它的任何对象实例。在您的情况下,这显然不是您想要的,因为您正在向流发送一个对象,然后立即重置,这是没有意义的。
看起来您只需要一个flush();如果这还不够,那么问题就在接收方。
发布于 2014-11-23 13:33:26
我认为您混淆了close()和reset()。使用
oos.close();而不是oos.reset();
发布于 2014-11-23 14:01:03
调用reset()是想要做的一件非常有效的事情。有可能‘数据’被重用,或者数据中的某些字段被重用,第二次他调用sendUpdatedVersion时,该部分不被发送。因此,那些抱怨使用无效的人是不准确的。现在,关于为什么要收到此错误消息
错误消息的意思是,您不在writeObject调用链的顶层。sendUpdatedVersion必须是从另一个writeObject调用的方法调用的。
我假设某个对象正在实现自定义的writeObject(),并且该方法正在调用此方法。
因此,您必须区分在调用链的顶层调用sendUpdatedVersion的时间,并且只在这些情况下使用reset()。
https://stackoverflow.com/questions/27089419
复制相似问题