与 http 请求通信 Java-Java 脚本

Communication Java-Javascript with http requests

最近我一直在尝试在 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;
      }

}

现在我必须制作 scratch 端 HTTP 客户端。我尝试过的每一种方式,它只是没有用。我尝试打开浏览器,输入 http://localhost:9090/pollplayer?name=yotam_salmon,它会漂亮地报告我的播放器位置。现在我的问题是 scratch 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,然后回调它。

我很乐意得到解决方案:)谢谢!

解决方法非常简单。我只需要添加一个"Allow-Access-Cross-Origin"的header,它就解决了。

httpExchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*");
httpExchange.getResponseHeaders().set("Content-Type", "text/plain");