gpt4 book ai didi

javascript - JxBrowser 从资源 URL 加载 HTML,无法打开 websocket

转载 作者:行者123 更新时间:2023-11-30 06:19:37 24 4
gpt4 key购买 nike

我正在使用 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: 协议(protocol)而出现问题?或者这是一个问题,因为 chrome 不允许不安全的 websocket 连接?

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

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

最佳答案

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

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

关于javascript - JxBrowser 从资源 URL 加载 HTML,无法打开 websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53961652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com