【问题标题】:Communication Java-Javascript with http requests使用 http 请求通信 Java-Javascript
【发布时间】: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


【解决方案1】:

解决方案非常简单。我只需要添加一个“Allow-Access-Cross-Origin”的标题,它就解决了。

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

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2021-09-12
    • 2023-03-27
    相关资源
    最近更新 更多