2011-10-19 5 views
2

この問題は私を壁に押し上げています。これは、非常に私が現在取り組んでいる単純なオンラインマルチプレイヤーゲームです。シリアル化されたオブジェクトは、UDP経由でクライアントのJavaに送信された後にヌル値を持っています

私は現在、udp経由でクライアントにパケットを送信できます。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) {} 

シリアライズされる「データ」オブジェクトが正しい値に満ちています。私はこれを確信しています。私はこの逆シリアル化後に任意の値を読み取るしようとすると、私はNullPointerExceptionが取得

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; 

} 

他の関連するコード・ブロックは、クライアント側での受信ブロックです。誰かが私を正しい方向に向けることができれば、私は非常に満足しています。

ああ、私は地元のホストに意図的に物事をテストするために送信しています。私のクライアントとサーバーはどちらも自分のマシンで動作しています。

答えて

2

送信側と受信側の両方で、例外をキャッチして押しつぶしています。問題の診断に役立つ証拠が隠れている可能性があります。これが当てはまらない場合でも、そのような例外を押しつぶすことは危険な習慣です。

受信側のコードにClassNotFoundExceptionがスローされている可能性があります。これによりdata == nullが残ってしまい、次のループでNPEが発生します。

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

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

シリアライズされたデータの一部がclose()まで、出力ストリームに書き込まれていない場合、彼らはこのような場合には失われることになります。あなたのコードで

+0

ヘッドアップに感謝します。例外に一意のプリントアウトを追加しましたが、これを修正することにまだ近くなっていません。 – araisbec

+0

あなたは賭け金に間違いはありませんでした。私は間違いなく、今からあなたの例外を適切に処理するためのアドバイスをしています。さて、なぜ私はその例外を取得すると思いますか?データグラムは私が作成したクラスであり、ソースファイルはソースディレクトリにあります(私はNetbeansにあります)...私はそれのオブジェクトを作成することもできます。 – araisbec

+0

あなたは男です。私はこの問題を追求し、あなたの投稿の別のものを読むことによって問題を実際に見つけました。私はDatagramクラスの* copy *を追加してサーバー側にオブジェクトを作成しましたが、別の*パッケージ名*を作成していました。私はそれがそれほど気にならなかったのか分かりませんでした。 – araisbec

2

一つの可能​​性のある問題は、あなたがObjectOutputStreamを閉じる前にtoByteArray()を呼び出すことです。ストリームを閉じた後にtoByteArray()に電話してみてください。

+0

チップをありがとうが、それは問題を解決しませんでした。 @Stephenは正しかったですが、なぜClassNotFoundExceptionを取得しているのかわかりません... – araisbec

関連する問題