在我为使用RMI服务器回调的多用户/网络回合制游戏创建的设计/架构之后,我尝试创建一个分布式动画,其中我的模型(Ball)是远程对象,它通过回调机制更新客户端服务器
目前的代码情况是:
模型远程对象,它是迭代客户端列表并调用它们的更新方法,
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实现轮询机制?
感谢任何反馈。
jibbylala
答案 0 :(得分:1)
轮询与您用于实现客户端和服务器的协议无关。
客户端轮回无休止地进行轮询。在循环内部,向服务器请求信息。服务器发回所需信息或“未准备好”消息。客户端执行其操作并等待,直到需要发送下一个请求。
如果您碰巧选择RMI,则表示RMI客户端和服务器。但无论如何,投票机制都是一样的。
将问题分解成碎片 - 思考和解决问题会更容易。
忘记开始投票。您可以编写RMI服务器,启动它,并创建一个单独的客户端来发出单个请求吗?如果你能做到这一点,那么你把它放在一个带睡眠的循环中来实现延迟,你就完成了。
答案 1 :(得分:0)
我不相信你可以通过Java RMI实现回调。您需要按照建议设置轮询,或者制作“客户端”RMI服务器,您可以直接向他们发送消息。
你怎么能以不同的方式做到这一点?我建议使用JMS消息传递将命令对象发送到客户端,这将为您处理所有分发。