@kirill-93

Как отличать клиентов на websocket сервере в nodejs?

Пробую писать чат на вебсоткетах.
На сервере код такой:
const WebSocket = require('ws');

const server = new WebSocket.Server({port: 3001});

const activeClients = [];

server.on('connection', ws => {
    activeClients.push(ws);

    ws.on('close', data => {
        //Что мы тут полчаем? data = 1006
    });

    ws.on('message', message => {
       //Как отправить сообщение конкретному пользователю?
    });

});

Подскажите, пожалуйста:
1) Как мне отличать клиентов? Я не нашел у объекта ws (on connection) какого-то уникального поля, вроде id. В интернете пишут, что id нужно добавлять самостоятельно.
2) Как мне узнать какой из клиентов отсоединился? В событии ws.on('message') возвращается какая-то цифра. Я не понял что это.
3) Как мне отправлять сообщение конкретному пользователю? Этот пункт вытекает из пукта 1.
4) Ну и если действительно нет какого-то идентификатора по умолчанию, то почему они его не сделали? Почему не генерируют id сразу и не передают его в on('close')? Это ведь было бы очень удобно.

Вот мои костыли, которые работают, но я не уверен, что я делаю правильно:
const WebSocket = require('ws');

const server = new WebSocket.Server({port: 3001});

const activeClients = [];

function generateUniqueID() {
    //return some random string
}

server.on('connection', ws => {
    ws.uniqueID = generateUniqueID();//Костыль: Добавляем собственный ID

    activeClients.push(ws);

    ws.on('close', data => {
         //Костыль: знаем что кто-то отсоединился, проходимся по массиву клиентов и смотрим, у кого статус "отключен"
        activeClients.forEach(client, i => {
            if (client.readyState !== WebSocket.CLOSE) {
                activeClients.splice(i, 1);
            }
        });
    });

    ws.on('message', message => {
       //Костыль: получаем из message ID пользователя, которому нужно отправлить сообщение (toUserID) и отправляем ему, перебрав весь массив
       const data = JSON.parse(message);

        activeClients.forEach(client, i => {
            if (client.readyState === WebSocket.OPEN && client.uniqueID === data.toUserID) {
                client.send(...)//Сообщение конкретному пользователю.
            }
        });
    });

});

Мои костыли работают, скажите пожуйста, какие у меня ошибки? Как сделать проще и правильнее?

UPD:
Дайте какой-нибудь туториал по созданию настоящего чата. Во всех уроках создается банальный чат, который принимает сообщение и отправляет его ВСЕМ остальным клиентам. Хотелось бы посмотреть, как делают более сложный функционал.
  • Вопрос задан
  • 1367 просмотров
Решения вопроса 1
@Abcdefgk
Ну-у-у... надо обратиться к матчасти. Понятный учебный пример тут ->
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Рекомендую посмотреть в сторону socket.io
Ответ написан
sedoyjan
@sedoyjan
фронт-енд разработчик
Не вижу проблемы в том чтобы хранить коннекшены под уникальными идентификаторами
Только я использую https://www.npmjs.com/package/uuid
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы