Socket.io поддерживает несколько подключенных сокетов для одного клиента - PullRequest
1 голос
/ 04 апреля 2019

Я использую Socket.io для подключения клиента React к серверу Node.js и параметр query в socket.io для уникальной идентификации каждого нового клиента. Однако сервер создает несколько сокетов для каждого клиента, и, когда мне нужно что-то отправить с сервера, я не знаю, какой сокет использовать, потому что у меня их несколько, и все они подключены.

Код клиента:

import io from "socket.io-client";
...
const socket = io(process.env.REACT_APP_API_URL + '?userID=' + userID, { forceNew: true });

socket.on('connect', () => {
        socket.on('new-order', data => {
            const { add_notification } = this.props;
            add_notification(data);
        });

Код сервера:

....
server = http
        .createServer(app)
        .listen(8080, () => console.log(env + ' Server listening on port 8080'));
io = socketIo(server);

io.on('connection', socket => {
    const userID = socket.handshake.query.userID;
    socket.on('disconnect', () => {
        socket.removeAllListeners();
    });
});

А вот серверная сторона, которая отправляет события клиенту:

for (const socketID in io.sockets.connected) {
    const socket = io.sockets.connected[socketID];
    if (socket.handshake.query.userID === userID) {
        // Here, I find more than one socket for the same condition, always connected.
        socket.emit(event, data)
    }
}

Здесь можно увидеть все эти сокеты для одного и того же клиента:

enter image description here

Я пытался отправить события для всех сокетов из данного userID, однако, несколько событий инициируются клиентом, показывая дублированные данные пользователю. Я также пытался отправить события в последний сокет, но иногда это работает, иногда нет.

Кто-то знает, как однозначно идентифицировать сокет при наличии нескольких клиентов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...