我正在制作语音聊天程序,但出现OptionalDataException错误,在添加语音之前,代码从未遇到此问题。语音通信是由不同的套接字处理的,所以我看不到问题。
码:
public class Client implements Runnable { // CLIENT
private String msg;
public void run() {
try {
s1 = new Socket(ipAddress, port);
s2 = new Socket(ipAddress, 1210);
o1 = new ObjectOutputStream(s1.getOutputStream());
o1.writeObject(name);
serverListModel.addElement(name);
i1 = new ObjectInputStream(s1.getInputStream());
Thread voice = new Thread(new ClientAudio());
voice.start();
while(true) {
msg = (String) i1.readObject();
String[] namePart = msg.split("-");
if(namePart[0].equals("AddName") && !namePart[1].equals(name) && !serverListModel.contains(namePart[1])) {
serverListModel.addElement(namePart[1]);
}
if(namePart[0].equals("RemoveName") && !namePart[1].equals(name)) {
serverListModel.removeElement(namePart[1]);
}
if(!msg.equals(null) && !namePart[0].equals("AddName") && !namePart[0].equals("RemoveName")) {
chatWindow.append(msg+"\n");
}
}
} catch (IOException | ClassNotFoundException e) {
chatWindow.append("Server Closed");
e.printStackTrace();
try {
s1.close();
} catch (IOException e1) {
e1.printStackTrace();
}
mainWindow(true);
}
}
}
flag
它被扔到
msg = (String) i1.readObject();
上并说java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1361)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at client.chat$Client.run(chat.java:319)
at java.lang.Thread.run(Thread.java:745)
最佳答案
从Oracle:
异常,指示由于未读的原始数据或流中属于序列化对象的数据的结尾而导致对象读取操作失败。在两种情况下可能会引发此异常:
当流中的下一个元素是原始数据时,尝试读取对象。在这种情况下,OptionalDataException的length字段设置为立即可从该流读取的原始数据的字节数,而eof字段设置为false。
试图通过类定义的readObject或readExternal方法读取超出消耗性数据结尾的数据。在这种情况下,OptionalDataException的eof字段设置为true,而length字段设置为0。
看来Stream中的下一个对象不是String
。
服务器代码受您控制吗?还是您至少有来源?如果是这样,请验证String
对象是唯一要发送的对象,或者调整代码以处理实际发送的对象/基元。
编辑
从另一个问题Voice Server not working:
byte[] soundData =
//...
o.write(soundData, 0, bytesRead);
...看来您没有将
String
对象写入ObjectOutputStream
。实际上,甚至不写对象,而是原始字节。您必须以与写入数据相同的方式读取数据。其他任何东西都行不通。