首先,我知道并且我知道这是一个重复的问题,但在其他答案中,我无法理解!
所以,我正在使用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可以删除它,如果他们想要,请回答!我对此错误感到非常恼火!
答案 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。