【问题标题】:JxBrowser loading HTML from resource URL, cannot open websocketJxBrowser 从资源 URL 加载 HTML,无法打开 websocket
【发布时间】:2018-12-28 16:42:22
【问题描述】:

我正在使用 JxBrowser 加载驻留在 jar 中的 html 文件。此 html 文件有一个连接失败的 websocket(我在 onclose 事件中收到代码 106)

我从 JxBrowser 收到这些错误

09:20:18.381 信息:09:20:18 严重:[1228/092018.371:ERROR:validation_errors.cc(87)] 无效消息:VALIDATION_ERROR_DESERIALIZATION_FAILED

09:20:18.382 信息:09:20:18 严重:[1228/092018.371:ERROR:render_process_host_impl.cc(4145)] 为错误的 Mojo 消息终止渲染进程:收到错误的用户消息:WebSocket 验证失败:: AddChannelRequest 解串器 [VALIDATION_ERROR_DESERIALIZATION_FAILED]

09:20:18.382 INFO: 09:20:18 SEVERE: [1228/092018.371:ERROR:bad_message.cc(23)] 为错误的 IPC 消息终止渲染器,原因 123

这是我创建浏览器的代码

Browser browser = new Browser();
BrowserView browserView = new BrowserView(browser);
browser.addConsoleListener(new ConsoleListener() {
            @Override
            public void onMessage(ConsoleEvent ce) {
                System.out.println("Console log from " + ce.getSource() + " message " + ce.getMessage());
            }
        });
        
        BrowserContext browserContext = browser.getContext();
        ProtocolService protocolService = browserContext.getProtocolService();
        protocolService.setProtocolHandler("jar", new ProtocolHandler() {
            @Override
            public URLResponse onRequest(URLRequest request) {
                try {
                    URLResponse response = new URLResponse();
                    URL path = new URL(request.getURL());
                    InputStream inputStream = path.openStream();
                    DataInputStream stream = new DataInputStream(inputStream);
                    byte[] data = new byte[stream.available()];
                    stream.readFully(data);
                    response.setData(data);
                    String mimeType = getMimeType(path.toString());
                    response.getHeaders().setHeader("Content-Type", mimeType);
                    return response;
                } catch (Exception ignored) {
                }
                return null;
            }
        });
        URL url = getClass().getClassLoader().getResource("resources/example.html");
        browser.loadURL(url.toExternalForm());

这是我的 WebSocket 代码的简化版本

this.ws = new WebSocket('ws://127.0.0.0:1337');
        this.ws.onopen = () => {
            console.log('OnOpen');
        };
        this.ws.onmessage = (evt) => {
            console.log('OnMessage ' + evt.data);
        };
        this.ws.onerror = (event) => {
            console.log('OnError');
        };
        this.ws.onclose = (event) => {
            console.log('OnClose ' + event.code + ' ' + event.reason);
        };

我很难找到有关从 Chromium 收到的错误消息的信息。会不会因为 URL 使用 jar: 协议而出现问题?或者这是一个问题,因为 chrome 不允许不安全的 websocket 连接?

(编辑)当我使用 JxBrowser 的 loadHTML 方法并提供 HTML 文件的字符串文本时,套接字连接。所以我相信这与我从资源 URL 加载这一事实有关,而不是与 chrome 不允许不安全的 websocket 连接有关。我真的不想流式传输文件内容以便我可以使用 loadHTML。

(Edit2) 从文件 URL 加载 HTML 也可以。我想我可以在 jar 中创建 HTML 文件的本地副本并加载它。我很失望我无法使用 jar URL 执行此操作,我想这可能是 JxBrowser 的限制。

【问题讨论】:

    标签: javascript java websocket jxbrowser


    【解决方案1】:

    根据您的描述,问题肯定与使用 jar: 协议的 URL 有关。似乎 websocket 仅适用于 file: http:https: 协议。

    在这种情况下,最好的解决方案是从 example.html 文件中读取 HTML,然后使用 loadHTML 方法而不是 loadURL 加载它。

    【讨论】:

    • 我真正的 HTML 文件正在加载 type=module 脚本,该脚本使用 es6 导入到另一个文件。我不认为 loadHTML 能够处理这个问题,因为它无法找到那个导入文件。
    【解决方案2】:

    我决定将 HTML 文件从 jar 复制到本地文件夹,并使用文件 URL 加载它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2012-07-26
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多