Java Протокол CometD Jetty эквивалентен javascript - PullRequest
0 голосов
/ 05 февраля 2020
    webSocketClient = new WebSocketClient();
    webSocketClient.start();
    wsTransport = new JettyWebSocketTransport(null, null, webSocketClient);
    bayeuxClient = new BayeuxClient(url, wsTransport);
    bayeuxClient.getChannel(someChannel);
    bayeauxClient.handshake(handshakeAuthRequest);

Учитывая, что вышеуказанный код Java работает (и все было объявлено), как я могу указать Jetty ClientTransport wsTransport в Javascript (node.js )?

Я пробовал что-то вроде:

var connection = new comet.CometD();
connection.configure({
    url: url,
    channel: someChannel
}

connection.handshake(handshakeAuthRequest, function (response) {
    console.log(response);
});

Но я получаю Неизвестную причину транспортировки Bayeaux, возможно, потому что у меня нигде не указан транспортный протокол Jetty, и я не могу Я нахожу, как это сделать для javascript. Часть ответа ниже.

 {
  id: '1',
  successful: false,
  channel: '/meta/handshake',
  failure: {
    reason: 'Unknown Bayeux Transport',
    exception: undefined,
    httpCode: 400,
    connectionType: 'long-polling',
 ......
 }

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Если сервер работает с клиентом Java, то он должен работать и с клиентом JavaScript.

CometD имеет клиентскую библиотеку браузера - JavaScript, которая поставляется с основным проектом CometD а также присутствует здесь .

Существует также клиентская библиотека nodejs - JavaScript, которая представляет собой крошечную оболочку для библиотеки браузера - JavaScript, здесь и он развернут как NPM пакет здесь .

Ошибка «Неизвестный транспорт Bayeux» обычно возникает из-за того, что сервер не поддерживает WebSocket, или неправильно настроен, поэтому сначала убедитесь, что он работает с клиентом Java, если вам проще, а затем используйте клиент NodeJS.

0 голосов
/ 07 февраля 2020

Короткий ответ заключается в том, что вы можете определить протокол веб-сокета, позвонив yourCometDObject.registerTransport('websocket', new comet.WebSocketTransport())

Длинный ответ для моего случая и node.js Я буду начать с констатации важной информации. Имейте в виду, что я нахожусь в проекте node.js.

В файле cometd. js из репо cometd, инстанцируя CometD объект вызывает этот блок, добавляя протокол websocket :

if (window.WebSocket) {
        this.registerTransport('websocket', new WebSocketTransport());
}

И вот предостережения.

  1. Node.js не имеет объекта window (имеет смысл, поскольку он сначала рассматривается как серверная структура).
  2. Существует библиотека cometd-nodejs-client, но она не поддерживает протокол websocket , как указано на их странице github. Поэтому добавить его позже с помощью registerTransport('websocket', new WebSocketTransport()) невозможно, поскольку WebSocketTransport не определен в этой библиотеке.

Чтобы использовать websocket в node.js с cometd, вам необходимо установить пакет browser-env и использовать его следующим образом: require('browser-env)(); в вашем модуле. Это позволит обойти окно объект не существующую часть.

После этого становится просто получить код, который я разместил здесь, и добавить то, чего не хватает.

var connection = new comet.CometD();
var transport = new comet.WebSocketTransport();
connection.registerTransport('websocket', transport);
connection.unregisterTransport('callback-polling');
connection.unregisterTransport('long-polling');
connection.configure({
    url: url,
    channel: someChannel
}

connection.handshake(handshakeAuthRequest, function (response) {
    console.log(response);
});

Обратите внимание, что я также удалил long-polling и протоколы обратного вызова . Вы также можете указать индекс 0 для протокола websocket, если вы хотите, чтобы он был по умолчанию, например:

connection.registerTransport('websocket', transport, 0);
...