javascript - 如何将 jade-agents (java) 和 babylon.js (html/javascript) - Servlet 连接到 html?

标签 javascript java html babylonjs agents-jade

总结:
集成开发环境:Eclipse
服务器:Java
客户端:HTML/Javascript
通过 ajax/jquery 将数据发送到 servlet 并使用 JadeGateway 将这些信息发送到代理后,结果数据应该返回到 html/javascript。 我需要一种方法来将 servlet 或代理与现有的和正在运行的 html 文件连接(ofc 而无需重新加载页面)。

背景:
我想使用 babylon.js 和 jade/pug(我们称它为 jade)创建一个基于代理的游戏。 在游戏过程中,有关游戏状态的信息应该发送给代理,以便他可以弄清楚该怎么做(例如创建更多单位或攻击)。在此之后,代理需要将信息发送到游戏,以调用相应的函数。

到目前为止我做了什么:
我使用 ajax 将游戏 (html/javascript) 与 servlet 连接起来。我在那里使用 JadeGateway 将 ACLMessage 发送给代理。 我也使用 websockets 来连接客户端/服务器,但这种方法对于我认为需要的东西来说太有限了。 我现在需要一种工具/方法或提示来从代理或 servlet 发送信息。两者都是可能的,因为代理可以将信息发送回 jadegateway 代理/servlet。 我知道如何使用 ajax 从 html 调用 servlet 并立即返回,但现在信息被转移到其他一些类,因此不再起作用。

在 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();
                }
            }

也许没有必要显示这些代码,因为它们正在工作并且问题不存在,但是提问的模板需要这些。

预期和结果:
所以问题不在于它不起作用,而在于我需要知道如何继续。 我不知道我期待什么,因为我不知道可能性。 也许对我有帮助的是从代理或 servlet 发送一个简单的字符串,我可以在游戏中使用警报功能调用它。

或者也许我应该问这个问题:在将数据发送到 servlet 并传递给代理后,是否有可能在 ajax(成功函数)中获得答案?

对于大量垃圾邮件,我们深表歉意。希望我说清楚了我的问题。

最佳答案

不用回复,websockets毕竟是解决方案。 我刚刚发现,您可以在没有客户端请求的情况下将数据从服务器推送到客户端

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

session 是自动生成的,你可以使用 websockets 的 onopen 方法获取它:

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

关于javascript - 如何将 jade-agents (java) 和 babylon.js (html/javascript) - Servlet 连接到 html?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045931/

相关文章:

html页脚不起作用

javascript - 无法在服务器日志中显示request.body?

javascript - 在 Node JS 中导出一个类

javascript - 使用 Ajax 将密码发送到 PHP

java - Android应用程序的多语言支持

java - HTTP Google 登录 - Cookie 已关闭

java - Java初学者,在最后一个if-else语句中,我只是无法弄清楚 "but not both "部分

html - 有没有办法添加新行以显示在 HTML 中 Anchor 标记的标题属性中?

javascript - 如何使用 TypeScript API 获取所有标识符引用

javascript - 封装 jQuery block 以供重用