Java - 错误StreamCorruptedException:无效的类型代码:AC

时间:2016-06-29 10:00:53

标签: java sockets serialization

首先,我知道并且我知道这是一个重复的问题,但在其他答案中,我无法理解! 所以,我正在使用java的套接字进行客户端 - 服务器连接。我有一个名为Listener的类,每次我得到一个新客户端时,我都会将它分配给客户端套接字。然后我反复听客户端,如果我从客户端得到答案,我将它发送到接口“类”中的方法(这最后一件事不是关于这个问题,但我不想要任何人询问它)
我的代码:

         while(!s.isClosed()){
            ob = new ObjectInputStream(s.getInputStream());
            try {
                handler.objectReceived(ob.readObject(), instance);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        }

其中“s”是套接字,“ob”是ObjectOutputStream,“handler”是上面提到的接口。但是,经过一段时间使用它,我得到错误java.io.StreamCorruptedException:无效的类型代码:handler.objectReceived(ob.readObject(), instance);行中的AC ......

任何帮助??

注意:请不要将此问题标记为重复。我无法理解其他答案,我只是要求某人清楚地解释清楚。之后,mods可以删除它,如果他们想要,请回答!我对此错误感到非常恼火!

1 个答案:

答案 0 :(得分:0)

您最可能的原因是您不断重新创建ObjectInputStream。 如果您将代码更改为此代码,则假设流未损坏,它应该可以正常工作。

ob = new ObjectInputStream(s.getInputStream());
while(!s.isClosed()){

    try {
        handler.objectReceived(ob.readObject(), instance);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我假设您编写对象的代码一次创建一个ObjectOutputStream。 当您创建ObjectOutputStream时,它会写入一个包含4个字节的标头。

bout.writeShort(STREAM_MAGIC);
bout.writeShort(STREAM_VERSION);

现在,当您创建一个ObjectInputStream时,它将读取标头(此调用在构造函数中完成)。

现在因为您不断重新创建ObjectInputStream,它会尝试读取数据流中不存在的标头。

本质上,只创建一次ObjectOutputStream和ObjectInputStream。