簡體   English   中英

OptionalDataException Java

[英]OptionalDataException Java

我正在制作語音聊天程序,但出現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對象是唯一要發送的對象,或者調整代碼以處理實際發送的對象/基元。

編輯

從另一個問題來看, 語音服務器無法正常工作

byte[] soundData = 
//...
o.write(soundData, 0, bytesRead);

...好像您沒有將String對象寫入ObjectOutputStream 實際上,甚至不寫對象,而是原始字節。 您必須以與寫入數據相同的方式讀取數據。 其他任何東西都行不通。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM