0

クライアントサーバーベースのsandboxgameをプログラミングしていて、奇妙なバグがあります。 サーバーは、プレイヤーを含むArrayListのすべてのエンティティを保存します。 また、Entity-ArrayListにも含まれているプレーヤだけを含むArrayListを保存します。 すべてのティックとすべてのプレーヤーについて、サーバーはプレイヤーの位置、すべてのエンティティのリスト、クライアントベースのティックを行うコマンドを送信します。私はObject-Outputと-InputStreamを使用しています。 サーバーによって送信されたメッセージは、次のように探しています:Java Object-Stream:オブジェクトは送信中に変更されます

-> STPOS:{[email protected]} y-coord is 75.25017862499999, I already checked 
-> SDENT:{[[email protected]]}  y-coord is 75.25017862499999 
-> CLTICK 

クライアント入力は次のように思える:このように座標「魔法」の変更

<- STPOS: {[email protected]}  y-coord is 75.25017862499999 
<- SDENT: {[[email protected]]}  y-coord is 60.00158922 
<- CLTICK 

のArrayListのサーバ出力はこのように動作します:(アウト:ObjectOutputStreamの、エンティティ:ArrayListを、エンティティおよびProtocolClassは自分のクラスである)

out.writeObject(new ProtocolClass(PROTOCOL.sendEntities, entities)); 

クライアント側入力には、次のとおりです。(中:ObjectInputStreamのプレーヤが地面に落ちている場合)初めに

ProtocolClass pc = (ProtocolClass) in.readObject(); 
[...] 
[if pc.protocol equals PROTOCOL.sendEntities] 
entities = (ArrayList<Entity>) pc.object; 

Y-COORDは、「60」と増加します。 75.25 ...彼が地面に触れるときに彼が持つ座標です。 60.0015 ...は最初に送信された新しいy座標です。したがって、それは最初のダニのために働く。しかし、それは常にそうではなく、しばしば60にとどまります。

1つのストリームを使用するスレッドは1つしかないので、ストリームは非同期的に呼び出されません。すべての「クエリ」はキューに保存されます。私はプロジェクト全体をスキャンしましたが、実際には「SDENT」-Queryを一度だけ送信します。

なぜこのようなことが起こるのかわかりません。送信されたオブジェクトをArrayListにキャストすると、Eclipseで警告が生成されます。「チェックされていないキャスト」。鋳造物の他の場合にはそうではない。 ArrayListにキャストするだけでは違いはありません。

答えて

0

ObjectOutputStream.reset()は、同じオブジェクトの修正されたコイを書くたびに使用する必要があります。なぜJavadocを参照してください。

+0

ありがとうございました。 – Andreas

関連する問題