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());
}
注意事项如下。
- Node.js 没有 window 对象(有道理,因为它被认为是-首先结束框架)。
- 有一个
cometd-nodejs-client
库,但它 不 支持 websocket 协议,如其 github 页。因此,以后无法使用 registerTransport('websocket', new WebSocketTransport())
添加它,因为该库中未定义 WebSocketTransport。
为了在node.js
和cometd
中使用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-polling 和 callback-polling 协议。您还可以为 websocket 协议指定索引 0,以防您希望它成为默认值,例如:
connection.registerTransport('websocket', transport, 0);
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())
我的案例的长答案和 node.js 我将首先说明一些重要的信息。 请记住,我在 node.js 项目中。
在 cometd.js 文件中 cometd
回购,实例化 CometD 对象调用此块添加websocket 协议:
if (window.WebSocket) {
this.registerTransport('websocket', new WebSocketTransport());
}
注意事项如下。
- Node.js 没有 window 对象(有道理,因为它被认为是-首先结束框架)。
- 有一个
cometd-nodejs-client
库,但它 不 支持 websocket 协议,如其 github 页。因此,以后无法使用registerTransport('websocket', new WebSocketTransport())
添加它,因为该库中未定义 WebSocketTransport。
为了在node.js
和cometd
中使用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-polling 和 callback-polling 协议。您还可以为 websocket 协议指定索引 0,以防您希望它成为默认值,例如:
connection.registerTransport('websocket', transport, 0);