JxBrowser 正在从资源 URL 加载 HTML,无法打开 websocket

JxBrowser loading HTML from resource URL, cannot open websocket

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

我从 JxBrowser 收到这些错误

09:20:18.381 INFO: 09:20:18 SEVERE: [1228/092018.371:ERROR:validation_errors.cc(87)] Invalid message: VALIDATION_ERROR_DESERIALIZATION_FAILED

09:20:18.382 INFO: 09:20:18 SEVERE: [1228/092018.371:ERROR:render_process_host_impl.cc(4145)] Terminating render process for bad Mojo message: Received bad user message: Validation failed for WebSocket::AddChannelRequest deserializer [VALIDATION_ERROR_DESERIALIZATION_FAILED]

09:20:18.382 INFO: 09:20:18 SEVERE: [1228/092018.371:ERROR:bad_message.cc(23)] Terminating renderer for bad IPC message, reason 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 的限制。

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

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

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