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