2011-10-19 19 views
2

此問題正在推動我在牆上。這是一個很簡單簡單的在線多人遊戲,我目前正在努力。在通過UDP發送到java客戶端後,序列化對象具有空值

我目前能夠通過udp發送數據包給我的客戶端,他們似乎收到他們罰款。但是,當我向客戶端發送序列化對象並在另一端反序列化時,當我嘗試訪問我需要的值時,我得到NullPointerExceptions。我已經驗證了服務器端的對象被正確序列化(反序列化並檢查了數據),所以我99%確定我在發送數據包的代碼時做了一些非常錯誤的事情。

以下是序列化和從所述服務器發送「數據報」對象的代碼:

DatagramPacket sendPacket = null; 

    byte[] buf = null; 

    //Serialize the datagram object to send as a UDP packet 
    try { 

     // Serialize to a byte array 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutput out = new ObjectOutputStream(bos); 
     out.writeObject(data); 
     buf = bos.toByteArray(); 

     out.close(); 
     bos.close(); 

    } catch (IOException e) { 
    } 

    try { 
     sendPacket = new DatagramPacket(buf, buf.length, 
       InetAddress.getLocalHost(), 4004); 
    } catch (UnknownHostException e){} 

    try { 
     DatagramSocket sendSocket = new DatagramSocket(); 
     sendSocket.send(sendPacket); 
     changed = true; 
    }catch (IOException e) {} 

「數據」對象被序列化是充分正確值;我確信這一點。

其他相關的代碼塊是在客戶端的接收功能模塊:

public Datagram readDatagram() { 

    byte[] buff = new byte[20000]; 
    DatagramPacket packet = new DatagramPacket(buff, buff.length); 
    DatagramSocket receiver = null; 

    try { 
     receiver = new DatagramSocket(4004); 
     receiver.receive(packet); 
    } catch (IOException e) { 
     System.out.println("ERROR2"); 
    } 

    Datagram data = null;// = new Datagram(); 

    try { 
     // Deserialize from a byte array 
     ByteArrayInputStream bis = new ByteArrayInputStream(buff); 
     ObjectInput in = new ObjectInputStream(bis); 
     data = (Datagram) in.readObject(); 

     bis.close(); 
     in.close(); 
    } catch (ClassNotFoundException e) { 
    } catch (IOException e) { 
     System.out.println("ERROR3"); 
    } 

    for (int i = 0; i < 35; i++) { 
     System.out.print(data.getLevel()[i]); 
    } 

    receiver.close(); 

    return data; 

} 

當我嘗試這個反序列化後讀任何值,我得到的NullPointerException異常。如果有人能指引我正確的方向,我會非常高興。

哦,我現在正在故意發送給localhost,只是爲了測試一下。我的客戶端和服務器都在我的機器上運行。

回答

2

在發送端和接收端都會捕獲和壓縮異常。這是一個很好的機會,這是隱藏的證據,可以幫助你診斷問題。即使情況並非如此,擠壓這樣的例外是危險的做法。

我敢打賭,一個ClassNotFoundException被拋出接收端代碼。這會給你帶來data == null,然後在下面的循環中導致NPE。與您的代碼

+0

感謝您的提醒。爲例外添加了獨特的打印輸出,但是我仍然沒有接近解決這個問題。 – araisbec

+0

你的投注是正確的。從現在開始,我將明確地就您的建議妥善處理我的例外情況。現在,你爲什麼認爲我會得到這種例外? Datagram是我創建的類,源文件位於我的源代碼目錄中(我在Netbeans中)...我甚至可以創建它的對象。 – araisbec

+0

你是男人。我追求這個問題,並通過閱讀你的另一個帖子來發現問題。我在服務器端創建了一個Datagram類的* copy *對象,但是不同的*包名*。我不知道這是那麼敏感。 – araisbec

2

一個可能的問題是,你關閉ObjectOutputStream之前調用toByteArray()

out.writeObject(data); 
buf = bos.toByteArray(); 

out.close(); 
bos.close(); 

如果序列化數據的某些部分不能寫入到輸出流,直到close(),他們將失去在這種情況下。嘗試在關閉流後調用toByteArray()

+0

感謝您的提示,但沒有解決問題。 @Stephen在正確的軌道上,但我無法弄清楚爲什麼我得到了ClassNotFoundException ... – araisbec

相關問題