绑定到的事件?"/>
我如何实现WebSocket的通道逻辑,包括可以绑定到的事件?
我目前面临一个非常大的挑战:我自己的WebSocket服务器。我已经对身份验证和所有详细信息进行了编程,以便服务器运行并处理请求,但是目前我仍停留在实际逻辑上。
我为此用JavaScript写了一个类,应按如下所示进行调用:
let token = "ABC",
myWebSocketClient = new MyWebSocketClient(token);
myWebSocketClient.subscribe("cWhFVEtlOENNM0VwNmlrUlBmOVF1UT09").bind("create_browser_push", function (response) {
console.log(response);
});
想法是,我可以使用.subscribe()
订阅特殊频道,并使用.bind()
收听其中的特殊事件。为此,我已经找到了此文件作为我的方向,但这对我和我的需求来说有点过多:
.ts#L254
我的MyWebSocketClient
类看起来像这样
class MyWebSocketClient {
constructor(token) {
this.url = "ws://localhost:8181";
this.token = token;
this.connect();
}
connect() {
let self = this,
ws = new WebSocket(self.url);
ws.onopen = function () {
let authMsg = {
type: "authenticate",
payload: {token: self.token}
};
ws.send(JSON.stringify(authMsg));
};
}
subscribe(channelName) {
}
bind(eventName) {
}
}
我的客户端与WebSocket Server
中的NodeJS
连接并进行身份验证,这让我感到非常高兴。这很简单,但是有效:
const WebSocket = require('ws').Server;
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const wss = new WebSocket({
server: app.listen(8181)
});
let wsObj = null;
app.use(bodyParser.json());
wss.on('connection', ws => {
wsObj = ws;
ws.on('message', toEvent).on('authenticate', function (data) {
const receivedToken = data.token;
if (!receivedToken || receivedToken === '') {
return ws.close(4000, 'Bad Request');
}
verifyToken(receivedToken).then(() => {
//User is authenticated and connected
}).catch((err) => {
if (err === 401) {
return ws.close(4010, 'Unauthorized');
} else {
return ws.close(5000, 'Internal Server Error');
}
});
});
});
app.post('/', function (req, res) {
const receivedToken = req.query.token;
if (!receivedToken || receivedToken === '') {
return res.sendStatus(400).end();
}
verifyToken(receivedToken).then(() => {
//Request is valid and can be handled / maybe we need the wsObj here
console.log(req.body);
//Result of a request:
//{
// name: 'create_browser_push', <- The event
// data: 'null', <- Should be sent back to the client to be accessible over the "response" parameter
// channels: [ 'cWhFVEtlOENNM0VwNmlrUlBmOVF1UT09' ]
//}
}).catch(() => {
return res.sendStatus(401).end();
});
});
function toEvent(message) {
try {
const event = JSON.parse(message);
this.emit(event.type, event.payload);
} catch (err) {
console.log('Not an event: ', err);
}
}
function verifyToken(token) {
return new Promise(function (resolve, reject) {
if (token === 'ABC') {
resolve();
} else {
reject(401);
}
});
}
有人知道我如何以一种简单的方式完成此任务吗?这样,当我从后端发送东西时,该用户连接到该通道并绑定到该事件的消息得到了通知吗?
而且服务器可能会以某种方式知道哪个客户端订阅了特定的频道/事件,因此我不需要在客户端进行检查(如果这是合理的话?)>
非常感谢您的帮助!
我目前面临一个非常大的挑战:我自己的WebSocket服务器。我已经对身份验证和所有详细信息进行了编程,以便服务器运行并处理请求,但是目前我是...
回答如下:我的JavaScript经验有限,因为我所有的项目都主要是Python / Django,但实际上我只是研究需要JavaScript。因此,我正在使用该脚本,它将活动传递给我的通知,例如新的通知,评论,消息等。此外,我认为您可以通过运行npm run browserify
来生成websocket。在我的项目中查看此代码。希望你能从中受益。
更多推荐
我如何实现WebSocket的通道逻辑,包括可以绑定到的事件?
发布评论