0

したがって、カスタムオブジェクトを前後に渡すことになっているサーバーとクライアントのコンボがあります。これを実現するために、ObjectInputStream および ObjectOutpustStream クラスを使用しています。

サーバーのループは次のとおりです。

while((inputPosition = (Vector2i) objectIn.readObject()) != null) {
    Print.log("input line: " + inputPosition.toString());
    outputLine = "you moved to " + inputPosition.toString();
    out.println(outputLine);        
}

inputPosition は Vector2i で、2 つの整数 x と y だけを保持する単純なクラスです。

クライアントのループは次のとおりです。

while((serverOutput = in.readLine()) != null) {
    Print.log("Server says: " + serverOutput);
    position = calculatePosition(position, reader);
    Print.log("sending over: " + position.toString());
    objectOut.writeObject(position);
}

位置計算メソッドは次のようになります。

private static Vector2i calculatePosition(Vector2i position, BufferedReader reader) throws IOException {
    Print.log("i just got this: " + position.toString());
    String entry = reader.readLine().substring(0, 1);
    if(entry.equals("w"))
        position.y++;
    else if(entry.equals("s"))
        position.y--;
    else if(entry.equals("a"))
        position.x--;
    else if(entry.equals("d"))
        position.x++;

    return position;
}

これが何が起こるかです。私はサーバーに接続し、1 つの座標を正常に移動した後、同じ座標に何度もスタックします。

Server says: Use wasd to move around.
i just got this: 5, 5
w
sending over: 5, 6
Server says: you moved to 5, 6
i just got this: 5, 6
w
sending over: 5, 7
Server says: you moved to 5, 6
i just got this: 5, 7
a
sending over: 4, 7
Server says: you moved to 5, 6
i just got this: 4, 7

クライアント側の vector2i オブジェクトが最新であることは「sending over」行で確認できますが、サーバーから得られる応答は何度も同じものです。サーバーのログは次のようになります。

input line: 5, 6
input line: 5, 6
input line: 5, 6

同じデータを何度も受信しているようですが、ログによると、クライアントは新しいデータを送信しているはずです。

誰かが私が間違ったことを知っていますか?

4

1 に答える 1

2

一度オブジェクトを送信すると、そのオブジェクトへの参照が送信されます。これの意味は

  • オブジェクトを変更して再度送信しても、変更は表示されません
  • オブジェクト ストリームのメモリは、送受信されたすべてのオブジェクトへの参照を保持する必要があるため、ますます大きくなります。

これらの問題の両方を回避する方法は、reset()定期的に電話をかけることです。ライブラリは、安全に実行できることを認識していないため、これを実行できません。

于 2012-10-20T09:32:45.613 に答える