总结:
集成开发环境: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/