streamcorruptedexception:类型代码无效:ac

mepcadol  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(374)

我的问题是,当它第二次尝试读取对象时,会抛出异常:

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

我第一次发送完全相同的对象消息;然而,当我第二次尝试做同样的事情时,它抛出了上面的错误。是否需要重新初始化readobject()方法?我甚至打印出了下面这行接收到的消息对象,它与第一个正常工作的示例完全相同。

Object buf = myInput.readObject();

我假设附加有问题,但我真的没有附加的用处。每次我都想读一句新台词。我真的很感激你能帮我解决这个问题。谢谢您。

在这一行之前,我只是在run()方法中为套接字创建输入和输出对象。对象声明在class:-

@Override
public void run() {
    try {
        sleep((int) 1 * 8000);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        //Creating input and output streams to transfer messages to the server
        myOutput = new ObjectOutputStream(skt.getOutputStream());
        myInput = new ObjectInputStream(skt.getInputStream());
        while (true) {
            buf = myInput.readObject();
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你说得对;我不关东西。我不知道怎么做。

kt06eoxx

kt06eoxx1#

潜在的问题是您正在使用一个新的 ObjectOutputStream 要写入已使用先前 ObjectOutputStream 写信给。这些流具有由各自的构造函数写入和读取的头,因此如果您创建另一个 ObjectOutputStream 你将写一个新的标题,开头是-猜猜看什么?- 0xAC, 以及现有的 ObjectInputStream 此时不需要另一个标题,因此它会呕吐。
在@trashgod引用的java论坛线程中,我应该省略关于“两端的每个对象都是新的”的部分:那只是浪费。在套接字的生命周期中使用一个oos和ois,不要在套接字上使用任何其他流。
如果你想忘记你写的东西,用 ObjectOutputStream.reset(). 不要使用任何其他流或 Readers 或者 Writers 在同一个插座上。对象流api可以处理所有java原语数据类型和所有 Serializable 班级。

相关问题