2010-10-02 65 views
0

继我用RMI服务器回调为多用户/网络回合制游戏创建的设计/架构之后,我尝试创建一个分布式动画,其中我的模型(Ball)是远程对象,它通过服务器的回调机制更新客户端。轮询机制如何通过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); 
    } 
} 
..... 
} 

我一般的看法是,I M实施推进机构与RMI在那种情况下我需要实现轮询)

如果是这样我怎么能实现与RMI轮询机制的情况下?

感谢您的任何反馈意见。

jibbylala

回答

1

轮询独立使用,以实现客户端和服务器的协议。

客户端通过无限循环轮询。在循环内有一个请求到服务器的信息。服务器将所需信息或“未准备好”消息发回。客户端做它的事情,并等待直到下一个请求需要发送。

如果您碰巧选择RMI,则表示RMI客户端和服务器。但是轮询机制无论如何都是一样的。

将问题分解成碎片 - 这样更容易思考和解决问题。

忘记投票开始。你可以编写一个RMI服务器,启动它,并创建一个单独的客户端来发出一个请求?如果你能做到这一点,那么你把它放在一个有睡眠的循环中来实现延迟,你就完成了。

+0

谢谢,我粘贴代码更好地了解我在做什么,如果我错误的地方使用正确的术语,然后请原谅。 – 2010-10-02 16:40:47

+0

这里发生了太多的事情。简化 - 你能做我建议的简单事情吗?没有UI,没有线程 - 只需创建一个服务器,创建一个客户端并建立连接。从服务器的接口开始,因为它表示客户端想要从服务器取回什么以及服务器需要传递什么。我不会读你的代码。我已经给你一张很好的照片。现在取决于你。 – duffymo 2010-10-02 17:29:07

+0

谢谢,但我认为你谈论实现与RMI的客户端和服务器通信,我认为即时通讯超越该阶段,因为我已经提到我有这种设计是基于回调,它也是成功的回合制游戏,但我现在有问题在这种情况下动画时,多个客户端执行相同的方法,这是重复移动,我希望当该移动方法已被一个客户端调用时,则不需要其他客户端调用导致球的方法移动得越来越快。 – 2010-10-02 17:54:36

0

我不相信你可以通过Java RMI实现回调。您需要按照您的建议设置轮询,或者让您的“客户端”RMI服务器可以直接向其发送消息。

你怎么能做到这一点?我建议使用JMS消息发送命令对象给客户端,这将处理所有的分配给你。

+0

谢谢,但你会如何看看上面,当这不是与RMI回调。除了RMI,我没有别的选择。 – 2010-10-20 21:22:23

+0

当您将对象作为参数传递时,它会在客户端上序列化并在服务器上反序列化。该对象的副本被创建。如果你在副本上调用方法,他们很多人似乎都在工作,但他们不会调用原始方法。我已经实现了这个回调将客户端反向代理(使用我写的自定义RMI)的系统,但是我从来没有见过使用标准RMI的这种工作。 – 2010-10-21 19:40:54

+0

我认为你提到的问题;即时通讯患有这个问题,我创建了一个序列化的对象(球),其方法即时调用,但一些方法似乎不工作,我有4个球,即时通讯设置颜色和半径不同,但所有球与第一球都有相同的半径和颜色,我不知道为什么会出现这个问题,并且不知道问题是否因为你提到的问题而出现。什么是定制的RMI如果你可以谈论关于,我创建了一个应用程序,现在想优化那个和通用模型/模板,但是我担心我讨论的问题。 – 2010-10-21 21:48:03