【问题标题】:Java CometD Jetty protocol equivalent in javascriptjavascript 中等效的 Java CometD Jetty 协议
【发布时间】:2020-05-21 14:37:32
【问题描述】:
    webSocketClient = new WebSocketClient();
    webSocketClient.start();
    wsTransport = new JettyWebSocketTransport(null, null, webSocketClient);
    bayeuxClient = new BayeuxClient(url, wsTransport);
    bayeuxClient.getChannel(someChannel);
    bayeauxClient.handshake(handshakeAuthRequest);

考虑到上述 Java 代码有效(并且所有内容都已声明),我如何在 Javascript (node.js) 中指定 Jetty ClientTransport wsTransport

我已经尝试了一些类似的东西:

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',
 ......
 }

【问题讨论】:

    标签: javascript java node.js websocket cometd


    【解决方案1】:

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

    CometD 有一个浏览器 JavaScript 客户端库,该库随 CometD 主项目一起提供,还提供 here

    还有 nodejs-JavaScript 客户端库,它是浏览器-JavaScript 库 here 的一个小型包装器,它被部署为 NPM 包 here

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

    【讨论】:

    • 那是我一直在使用的库。最后是node版本没有websocket,javascript comet lib需要window对象的问题。
    【解决方案2】:

    简短的回答是可以通过调用yourCometDObject.registerTransport('websocket', new comet.WebSocketTransport())来定义websocket协议

    我的案例和 node.js 的长答案 我将首先陈述一些重要的信息。 请记住,我在一个 node.js 项目中。

    在来自cometd repo 的 cometd.js 文件中,实例化 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.js 中使用websocket with cometd,您必须安装browser-env 包并像这样使用它:require('browser-env)();in你的模块。这将绕过 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);
    

    【讨论】:

    • cometd-nodejs-client 自 1.1.0 版起支持 WebSocket,因此您无需执行此答案中描述的任何操作。只需按照cometd-nodejs-client 项目的自述文件中的说明进行操作即可。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2011-02-24
    • 2015-08-28
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多