OptionalDataException Java

时间:2016-04-28 02:57:13

标签: java client voice-recording optionaldataexception

我正在制作语音聊天程序,我收到 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)

1 个答案:

答案 0 :(得分:2)

来自Oracle

  

异常表示由于未读原始数据导致对象读取操作失败,或者属于流中序列化对象的数据结束。在两种情况下可能会抛出此异常:

     
      
  • 当流中的下一个元素是原始数据时,尝试读取对象。在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的原始数据的字节数,并且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。实际上,甚至没有写一个Object,而是原始字节。您必须以与编写数据相同的方式读取数据;其他任何事情都行不通。