#node.js #sockets #socket.io
#node.js #сокеты #socket.io
Вопрос:
Я использую сокет.ввод-вывод для подключения клиента React к Node.js сервер и query
опция в сокете.ввод-вывод для уникальной идентификации каждого нового клиента. Однако сервер создает несколько сокетов для каждого клиента, и, когда мне нужно что-то отправить с сервера, я не знаю, какой сокет использовать, потому что у меня их несколько, и все они подключены.
Клиентский код:
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)
}
}
Здесь можно увидеть все эти сокеты для одного и того же клиента:
Я попытался отправить события для всех сокетов из заданного userID
, однако на клиенте запускается несколько событий, отображающих дублированные данные пользователю. Я также пытался отправлять события в последний сокет, но иногда это работает, иногда нет.
У кого-нибудь есть подсказка, как однозначно идентифицировать сокет, когда есть несколько клиентов?
Комментарии:
1. что это за значения?
socket.handshake.query.userID
иuserID
возможно, они оба не определены, что будет верно несколько раз для каждого сокета2. Вы отправляете ответ на сокет, из которого пришел запрос. Если сокетов несколько, это потому, что клиент отправляет несколько запросов.
3. @azium, когда я делаю это на клиенте
io(process.env.REACT_APP_API_URL '?userID=' userID
, он заполняетsocket.handshake.query.userID
на сервере. Итак, для каждого сокета у меня есть этот идентификатор от его клиента. На самом деле, я не использую его в то время, я только показываю, как идентифицировать клиента.4. @user207421 Я не понял, что вы написали. Я не отвечаю клиенту. Он подключается и простаивает, ожидая некоторого уведомления от сервера. Это не чат, сервер отправляет данные клиенту только тогда, когда что-то происходит на серверной части.
5. является
userID
уникальным? возможно, несколько сокетов имеют одинаковый идентификатор