Как подключить jade-agent (java) и babylon.js (html / javascript) - сервлет к html? - PullRequest
0 голосов
/ 08 мая 2019

Резюме:
IDE: Затмение
Сервер: Java
Клиент: HTML / Javascript
После отправки данных через ajax / jquery сервлету и использования JadeGateway для отправки этой информации агенту, полученные данные должны вернуться в html / javascript. Мне нужен способ подключения сервлета или агента к существующему и запущенному html-файлу (ofc без перезагрузки страницы).

Справка:
Я хочу создать агентскую игру, используя babylon.js и jade / pug (назовем это jade). Во время игры информация о состоянии игры должна быть передана агенту, чтобы он мог понять, что делать (например, создавать больше юнитов или атаковать). После этого агенту необходимо отправить информацию в игру, чтобы вызвать соответствующую функцию.

Что я сделал до сих пор:
Я связал игру (html / javascript) с сервлетом, используя ajax. Там я использовал JadeGateway, чтобы отправить ACLMessage агенту. Я также использовал websockets для подключения клиент / сервер, но этот метод слишком ограничен для того, что мне нужно, я думаю. Теперь мне нужен инструмент / метод или советы для отправки информации от агента или сервлета. И то и другое возможно, потому что агент может отправить информацию обратно агенту / сервлету jadegateway. Я знаю, как использовать ajax для вызова сервлета из html и обратно, но теперь информация передается некоторым другим классам, так что это больше не работает.

В функции babylon.js scene.registerBeforeRender я делаю это:

$.ajax({
    url: "AgentListenerServlet",
    type: "POST",
    data: {playerString: convertPlayerToJson(player1)},
    success: function(data) {
        alert(data.command)
    },
    error: function() {
        alert("Listener Failed")
    }
});

Отправка сообщения агенту через jadegateway:

JadeGateway.execute(new CyclicBehaviour() {
    public void action() {
    final ACLMessage msgSend = new ACLMessage(ACLMessage.INFORM);
    msgSend.setContent(message);
    msgSend.addReceiver(new AID("First", AID.ISLOCALNAME));
    myAgent.send(msgSend);

    final ACLMessage msgReceive = myAgent.receive();
    if(msgReceive != null && msgReceive.getContent() != null){          
            //used this as immediate answer for ajax success function, but maybe it can also be used to send the returning agent message?
            Map <String, Object> map = new HashMap<String, Object>();
            map.put("command", "information");
            write(response, map);
      } else {
        block();
    }
    }
});

private void write(HttpServletResponse response, Map<String, Object> map) throws IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(new Gson().toJson(map));
    }

код агента (упрощенно):

public void action() {
                final ACLMessage msgSend = new ACLMessage(ACLMessage.INFORM); //sending message
                final ACLMessage msgReceive = receive(); //receiving message

                    //Here i get information out of sent json objects from jadegateway
                    //Maybe here send handled information back to html?
          } else {
                    block();
                }
            }

Возможно, показывать эти коды не нужно, потому что они работают, и проблема не в этом, но шаблон для того, чтобы задать вопрос, запросил их.

Ожидаемые результаты:
Так что проблема не в том, что это не работает, а в том, что мне нужно знать, как продолжить. Я не знаю, чего я ожидаю, потому что я не знаю возможностей. Может быть, мне поможет отправка простой строки от агента или сервлета, которую я могу вызвать с помощью функции оповещения в игре.

Или, может быть, я должен спросить это: возможно ли получить ответ в ajax (функция успеха) после того, как данные были отправлены сервлету и переданы агенту?

Извините за огромный спам. Надеюсь, я прояснил свою проблему.

1 Ответ

0 голосов
/ 09 мая 2019

Не нужно отвечать, веб-сокеты - это решение, в конце концов.Я только что выяснил, что вы можете передавать данные с сервера на клиент без запроса клиента с помощью

session.getBasicRemote().sendText(msgReceive.getContent());

Сеанс генерируется автоматически, и вы можете просмотреть его с помощью метода websockets onopen:

    @OnOpen
    public void onOpen(Session session){
        this.session = session;
    }
...