Java CometD Jetty 协议等效于 javascript

Java CometD Jetty protocol equivalent in javascript

    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 在 Java脚本中 (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',
 ......
 }

如果服务器与 Java 客户端一起工作,那么它也应该与 JavaScript 客户端一起工作。

CometD 有一个浏览器-JavaScript 客户端库,它随 CometD 主项目一起提供,也存在 here

还有nodejs-JavaScript客户端库,它是浏览器的一个小包装器-Java脚本库,here, and it's deployed as a NPM package here.

错误"Unknown Bayeux Transport"通常是由于服务器不支持WebSocket,或者配置不正确,所以如果更容易,请确保它首先与Java客户端一起使用你,然后使用 NodeJS 客户端。

简短的回答是你可以通过调用yourCometDObject.registerTransport('websocket', new comet.WebSocketTransport())

来定义websocket协议

我的案例的长答案和 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。

为了在node.jscometd中使用websocket,你必须安装browser-env 打包并像这样使用它: require('browser-env)(); 在你的模块中。这将绕过 window 对象不存在的部分。

之后,只需获取我在此处发布的代码并添加缺少的代码即可。

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-pollingcallback-polling 协议。您还可以为 websocket 协议指定索引 0,以防您希望它成为默认值,例如:

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