java - StreamCorruptedException : invalid type code: AC

标签 java multithreading streaming object

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

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() 方法中为套接字创建输入和输出对象。对象声明位于类中的 run() 方法之外:-

@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();
        }
    }
}

你是对的;我不关闭该对象。我不知道该怎么做。

最佳答案

根本问题是您正在使用新的 ObjectOutputStream 写入您已使用先前的 ObjectOutputStream 写入的流。这些流具有由各自的构造函数写入和读取的 header ,因此,如果您创建另一个 ObjectOutputStream,您将编写一个新的 header ,该 header 以 - 猜猜怎么着? - 0xAC, 和现有的 ObjectInputStream 此时不需要另一个 header ,因此它会失败。

在 @trashgod 引用的 Java 论坛帖子中,我应该省略有关“为两端的每个对象重新创建”的部分:这太浪费了。在套接字的生命周期中使用单个 OOS 和 OIS,并且不要在套接字上使用任何其他流。

如果您想忘记自己编写的内容,请使用ObjectOutputStream.reset()。

并且不要在同一套接字上使用任何其他流或ReadersWriters。对象流 API 可以处理所有 Java 原始数据类型和所有 Serialized 类。

关于java - StreamCorruptedException : invalid type code: AC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60817073/

相关文章:

java - 如何编写响应 `Thread.interrupt()` 的 native 代码?

clojure - Storm > 如何将 Java 回调集成到 Spout 中

networking - 使用 ffmpeg 录制/捕获不连续的音频流

java - 如何排除 Maven jar 依赖项中的 xml 文件

java - 在CBC模式下使用blowfish进行加解密,但是如何进行IV呢?

java - 如何开始测试(jMock)

javascript - 我们怎么称呼 JS async "strands of execution"?

java - 如果未指定 -d32 或 -d64 等选项,64 位 JVM 是否会以 64 位模式运行

java - 使用 Java 线程从列表中处理作业

node.js - 如何使用 node.js 从 stdin 逐行流式传输并发送到客户端?