JxBrowser загружает HTML из URL ресурса, не может открыть веб-сокет - PullRequest
0 голосов
/ 28 декабря 2018

Я использую JxBrowser для загрузки HTML-файла, который находится в банке.Этот HTML-файл имеет веб-сокет, который не может подключиться (я получаю код 106 в событии onclose)

Я получаю эти ошибки от JxBrowser

09: 20: 18.381 ИНФОРМАЦИЯ:09:20:18 SEVERE: [1228 / 092018.371: ОШИБКА: validation_errors.cc (87)] Недопустимое сообщение: VALIDATION_ERROR_DESERIALIZATION_FAILED

09: 20: 18.382 INFO: 09:20:18 SEVERE: [1228 / 092018.371:ОШИБКА: render_process_host_impl.cc (4145)] Завершение процесса рендеринга для плохого сообщения Mojo: Получено неверное сообщение пользователя: Ошибка проверки для десериализатора WebSocket :: AddChannelRequest [VALIDATION_ERROR_DESERIALIZATION_FAILED]

09: 20: 182082: INFO18 SEVERE: [1228 / 092018.371: ОШИБКА: 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 не разрешает небезопасные подключения к веб-сокетам?

(Правка) Сокет подключается, когда я использую метод loadHTML JxBrowser и предоставляю текст строки HTML-файла.Поэтому я считаю, что это как-то связано с тем, что я загружаюсь с URL-адреса ресурса, а не с тем, что chrome не разрешает незащищенные соединения через веб-сокеты.Я действительно не хочу передавать содержимое файла, чтобы я мог использовать loadHTML.

(Edit2) Загрузка HTML из файла URL также работает.Я думаю, что я могу создать локальную копию файла HTML в банке и загрузить его вместо этого.Я разочарован тем, что не могу сделать это, используя URL-адрес jar, возможно, это ограничение JxBrowser.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я решил скопировать HTML-файлы из банки в локальную папку и использовать URL-адрес файла для их загрузки.

0 голосов
/ 02 января 2019

Из того, что вы описали, проблема определенно связана с URL-адресом, использующим протокол jar :.Похоже, websocket работает только с файлом: http: и https: протоколами.

Лучшим решением в этом случае будет чтение HTML из файла example.html, а затем загрузка его с использованием метода loadHTML вместо loadURL .

...