0

RMI サーバー コールバックを使用してマルチユーザー/ネットワーク ターンベース ゲーム用に作成した設計/アーキテクチャに従って、モデル (ボール) がリモート オブジェクトであり、サーバーからのコールバック メカニズムを介してクライアントを更新する分散アニメーションを作成しようとしました。

コードの現在の状況は次のとおりです。

クライアントリストを反復し、それらの更新メソッドを呼び出しているモデルリモートオブジェクトは、

public class BallImpl extends UnicastRemoteObject implements Ball,Runnable {


    private List<ICallback> clients = new ArrayList<ICallback>();


    protected static ServerServices chatServer;
    static ServerServices si;

    BallImpl() throws RemoteException {
        super();
}
 ....

    public  synchronized void move() throws RemoteException {
        loc.translate((int) changeInX, (int) changeInY);
    }

    public void start() throws RemoteException {
        if (gameThread.isAlive()==false )
            if (run==false){
                  gameThread.start();

            }
    }
    /** Start the ball bouncing. */

        // Run the game logic in its own thread.

            public void run() {

                while (true) {
                    run=true;
                    // Execute one game step
                    try {
                        updateClients();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }

                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException ex) {
                    }
                }
            }
     public void updateClients() throws RemoteException {

        si = new ServerServicesImpl();
        List<ICallback> j = si.getClientNames();
        System.out.println("in messimpl " + j.size());
        if (j != null) {
            System.out.println("in ballimpl" + j.size());
            for (ICallback aClient : j) {
                aClient.updateClients(this);
            }

        } else
            System.err.println("Clientlist is empty");
       } 
    }

コールバック インターフェイスを実装し、更新メソッドを実装しているクライアント:

public final class thenewBallWhatIwant implements Runnable, ICallback {

.....

@Override
public void updateClients(final Ball ball) throws RemoteException {

    try {
        ball.move();
        try {
            Thread.sleep(50);
        } catch (Exception e) {
            System.exit(0);
        }
    } catch (Exception e) {
        System.out.println("Exception: " + e);
    }
}
 .....
}

私の一般的な認識は、RMIでプッシュメカニズムを実装しており、そのシナリオではポーリングを実装する必要があるということです)

その場合、RMI でポーリング メカニズムを実装するにはどうすればよいですか?

フィードバックをお寄せいただきありがとうございます。

ジビララ

4

2 に答える 2

1

ポーリングは、クライアントとサーバーの実装に使用するプロトコルには依存しません。

クライアントは無限にループしてポーリングします。ループ内には、サーバーへの情報要求があります。サーバーは、必要な情報または「準備ができていません」というメッセージを送り返します。クライアントはその処理を実行し、次の要求が送信される必要があるまで待機します。

RMI を選択した場合、それは RMI クライアントとサーバーを意味します。ただし、ポーリング メカニズムは同じです。

問題を細かく分割してください。その方が考えやすく、解決しやすくなります。

ポーリングを開始することを忘れてください。RMI サーバーを作成して起動し、別のクライアントを作成して単一の要求を作成できますか? それができる場合は、遅延を実装するためにスリープを使用してループ内に配置すれば完了です。

于 2010-10-02T16:20:53.627 に答える
0

Java RMI 経由でコールバックを実装できるとは思えません。あなたが提案したようにポーリングを設定するか、「クライアント」RMIサーバーにメッセージを直接送信できるようにする必要があります。

どうすればこれを別の方法で行うことができますか? JMS メッセージングを使用してコマンド オブジェクトをクライアントに送信することをお勧めします。これにより、すべての配布が処理されます。

于 2010-10-20T21:19:47.840 に答える