Как механизм опроса может быть реализован с помощью RMI? - PullRequest
0 голосов
/ 02 октября 2010

Следуя дизайну / архитектуре, которую я создал для многопользовательской / сетевой пошаговой игры с обратными вызовами 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

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Опрос не зависит от протокола, который вы используете для реализации клиента и сервера.

Клиент опрашивает бесконечный цикл.Внутри цикла есть запрос к серверу за информацией.Сервер отправляет обратно либо желаемую информацию, либо сообщение «не готов».Клиент делает свое дело и ждет, пока следующий запрос не будет отправлен.

Если вы выбрали RMI, это означает клиент и сервер RMI.Но механизм опроса одинаков независимо.

Разбейте проблему на части - так будет легче думать и решать.

Забудьте о начале опроса.Можете ли вы написать RMI-сервер, запустить его и создать отдельный клиент для одного запроса?Если вы можете сделать это, то поместите его в цикл с помощью сна, чтобы реализовать задержку, и все готово.

0 голосов
/ 21 октября 2010

Я не верю, что вы можете реализовать обратный вызов через Java RMI.Вам нужно либо настроить опрос, как вы предложили, либо настроить свои «клиентские» RMI-серверы, чтобы вы могли отправлять им сообщения напрямую.

Как вы могли бы сделать это по-другому?Я бы посоветовал использовать JMS-сообщения для отправки объектов команд клиентам, это бы обработало весь дистрибутив для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...