【问题标题】:How to connect jade-agents (java) and babylon.js (html/javascript) - Servlet to html?如何将jade-agents (java) 和babylon.js (html/javascript) - Servlet 连接到html?
【发布时间】:2023-03-20 12:02:01
【问题描述】:

总结:
IDE: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(成功函数)中得到答案?

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

【问题讨论】:

  • 当您说 Jade 时,您是指多代理平台,对吗? Pug 是一个模板引擎,曾经被称为玉,所以即使提到它也很混乱

标签: javascript java html babylonjs agents-jade


【解决方案1】:

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

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

会话是自动生成的,您可以使用 websockets onopen 方法重新接收它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2021-09-20
    相关资源
    最近更新 更多