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 回答