【发布时间】:2015-05-16 22:06:01
【问题描述】:
最近我一直在尝试在 minecraft 服务器(使用 Java 运行)和 Scratch(使用 JavaScript 运行)之间进行通信。 我已经用java写了代码:
package me.yotam180;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class HttpProcessor {
public MainClass plugin;
public HttpProcessor (MainClass plug) throws IOException {
plugin = plug;
plugin.getLogger().info("CREATED HTTTP PROCESSOR");
HttpServer server = HttpServer.create(new InetSocketAddress(9090), 0);
server.createContext("/pollplayer", new PollPlayerHandler());
server.createContext("/killplayer", new KillPlayerHandler());
plugin.getLogger().info("STARTED HTTTP SERVER");
server.setExecutor(null); // creates a default executor
server.start();
}
static class PollPlayerHandler implements HttpHandler {
@SuppressWarnings("deprecation")
@Override
public void handle(HttpExchange httpExchange) throws IOException {
// TODO Auto-generated method stub
Map <String,String>parms = HttpProcessor.queryToMap(httpExchange.getRequestURI().getQuery());
StringBuilder response = new StringBuilder();
response.append(Bukkit.getPlayer(parms.get("name")).getLocation().toString());
HttpProcessor.writeResponse(httpExchange, response.toString());
}
}
static class KillPlayerHandler implements HttpHandler {
@SuppressWarnings("deprecation")
@Override
public void handle(HttpExchange httpExchange) throws IOException {
// TODO Auto-generated method stub
Map <String,String>parms = HttpProcessor.queryToMap(httpExchange.getRequestURI().getQuery());
Bukkit.getPlayer(parms.get("name")).setHealth(0);
HttpProcessor.writeResponse(httpExchange, "SUCCESS");
}
}
public static void writeResponse(HttpExchange httpExchange, String response) throws IOException {
httpExchange.sendResponseHeaders(200, response.length());
OutputStream os = httpExchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
public static Map<String, String> queryToMap(String query){
Map<String, String> result = new HashMap<String, String>();
for (String param : query.split("&")) {
String pair[] = param.split("=");
if (pair.length>1) {
result.put(pair[0], pair[1]);
}else{
result.put(pair[0], "");
}
}
return result;
}
}
现在我必须制作临时的 HTTP 客户端。我尝试的每一种方法,它都不起作用。我尝试打开我的浏览器,我写了http://localhost:9090/pollplayer?name=yotam_salmon,它漂亮地报告了我的播放器位置。现在我的问题是从头开始的 JS。
这里是:
new (function () {
var ext = this;
// Cleanup function when the extension is unloaded
ext._shutdown = function () { };
// Status reporting code
// Use this to report missing hardware, plugin or unsupported browser
ext._getStatus = function () {
return { status: 2, msg: 'Ready' };
};
ext.get_Player = function (name, callback) {
//in this function i need to call http://localhost:9090/pollplayer?name= + name, wait for the response and then callback it.
//the response can't be "return response;", and it cannot be call backed from another function. If this function was called, it
//has to report the location back as a string
};
// Block and block menu descriptions
var descriptor = {
blocks: [
['R', 'location of %s', 'get_Player', 'Player'],
]
};
// Register the extension
ScratchExtensions.register('ScratchCraft', descriptor, ext);
})();
我无法以不同的方式格式化我的 JS 代码,因为 Scratch 仅适用于这种格式。(此处解释:http://llk.github.io/scratch-extension-docs/)。在ext.get_Player 函数中,我必须去Java http 服务器,请求/pollplayer?name= + name,然后回调它。
我很乐意得到解决方案 :) 谢谢!
【问题讨论】:
-
sun.net已弃用。使用正确的 HTTP 连接,例如依赖 Apache HTTP 库。 -
我确定您知道自己在做什么,但是 llk.github.io/scratch-extension-docs 中的样板代码看起来与您的不同;这是为什么?您是否尝试过“等待的报告程序块”代码示例(与您想要的非常相似),它是否有效?您是否检查了 Web 浏览器的 javascript 控制台是否存在可能的错误?您是否尝试过 packet analyzer 来验证是否将正确的 URL 发送到 Minecraft 服务器?
-
首先,非常感谢您的回答。等待的记者块正是我想要的,但我无法让它工作。我尝试了天气示例,它奏效了。之后,我将 $.ajax 部分中的 url 更改为我的 java 服务器,它停止工作。我认为我提供的 HTTP 响应可能是错误的。这是我第一次使用真正的 javascript,所以我不知道有一个控制台......我如何在 Chrome 中打开它?不,我没有使用数据包分析器,但我会尝试。明天在我的时区,我会尝试做出不同的 HTTP 响应方式,但谢谢。
-
如果代码示例在更改为您自己的 URL 时中断,则表明故障出在 Java 部分。数据包分析器显示“天气”URL 返回一个
Access-Control-Allow-Origin响应标头,正如建议的here。您的 Java 代码也应该这样做,否则 Web 浏览器可能会拒绝您的 URL,因为它是一个(不安全的)跨域请求。在 Google Chrome 中,您将在“更多工具”下的菜单中找到 JavaScript 控制台(快捷键:Ctrl+Shift+J)。 -
我添加了 httpExchange.getRequestHeaders().set("Access-Control-Allow-Origin", "*");在响应处理中,但现在即使在浏览器中也不会显示响应:(
标签: java javascript minecraft bukkit mit-scratch