最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

我如何实现WebSocket的通道逻辑,包括可以绑定到的事件?

IT培训 admin 12浏览 0评论

我如何实现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的通道逻辑,包括可以绑定到的事件?

我目前面临一个非常大的挑战:我自己的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。在我的项目中查看此代码。希望你能从中受益。

发布评论

评论列表 (0)

  1. 暂无评论