この問題は私を壁に押し上げています。これは、非常に私が現在取り組んでいる単純なオンラインマルチプレイヤーゲームです。シリアル化されたオブジェクトは、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;
}
:
他の関連するコード・ブロックは、クライアント側での受信ブロックです。誰かが私を正しい方向に向けることができれば、私は非常に満足しています。
ああ、私は地元のホストに意図的に物事をテストするために送信しています。私のクライアントとサーバーはどちらも自分のマシンで動作しています。
ヘッドアップに感謝します。例外に一意のプリントアウトを追加しましたが、これを修正することにまだ近くなっていません。 – araisbec
あなたは賭け金に間違いはありませんでした。私は間違いなく、今からあなたの例外を適切に処理するためのアドバイスをしています。さて、なぜ私はその例外を取得すると思いますか?データグラムは私が作成したクラスであり、ソースファイルはソースディレクトリにあります(私はNetbeansにあります)...私はそれのオブジェクトを作成することもできます。 – araisbec
あなたは男です。私はこの問題を追求し、あなたの投稿の別のものを読むことによって問題を実際に見つけました。私はDatagramクラスの* copy *を追加してサーバー側にオブジェクトを作成しましたが、別の*パッケージ名*を作成していました。私はそれがそれほど気にならなかったのか分かりませんでした。 – araisbec