首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ObjectOutputStream重置错误

Java ObjectOutputStream重置错误
EN

Stack Overflow用户
提问于 2014-11-23 13:24:40
回答 3查看 520关注 0票数 0

我的项目由两个部分组成:服务器端和客户端。当我启动服务器端时,一切都正常,但是当我不时地启动客户端时,我会得到以下错误:

代码语言:javascript
复制
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。

这是抛出错误的函数。

代码语言:javascript
复制
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();
        }
    }

我试着把冲水()放上去,但没什么用。有什么想法吗?此外,服务器端没有错误。

EN

回答 3

Stack Overflow用户

发布于 2014-11-23 13:31:27

我想你误解了reset()的工作。它重置流以忽略以前写入它的任何对象实例。在您的情况下,这显然不是您想要的,因为您正在向流发送一个对象,然后立即重置,这是没有意义的。

看起来您只需要一个flush();如果这还不够,那么问题就在接收方。

票数 1
EN

Stack Overflow用户

发布于 2014-11-23 13:33:26

我认为您混淆了close()和reset()。使用

代码语言:javascript
复制
oos.close();

而不是oos.reset();

票数 0
EN

Stack Overflow用户

发布于 2014-11-23 14:01:03

调用reset()是想要做的一件非常有效的事情。有可能‘数据’被重用,或者数据中的某些字段被重用,第二次他调用sendUpdatedVersion时,该部分不被发送。因此,那些抱怨使用无效的人是不准确的。现在,关于为什么要收到此错误消息

错误消息的意思是,您不在writeObject调用链的顶层。sendUpdatedVersion必须是从另一个writeObject调用的方法调用的。

我假设某个对象正在实现自定义的writeObject(),并且该方法正在调用此方法。

因此,您必须区分在调用链的顶层调用sendUpdatedVersion的时间,并且只在这些情况下使用reset()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27089419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档