Сервер socket на nodejs
Здравствуйте. Не могу разобраться в структуре массивов socket, sockets. Как должно: при подключение отправляется user_nick. Может быть в разных браузерах/вкладках одинаковый user_nick. При отправки сообщения отправляется user_from равный user_nick, а так же user_to. Сервер должен взять и user_from и user_to послать только им сообщение. Спасибо.
|
Цитата:
Поскольку сокеты это просто сетевое соединение (не http(s))... |
Цитата:
Цитата:
Про user_nick там вообще ни слова... :) |
ksa,
Это я знаю. Но есть же split. Т.е. у сервера база юзеров будет например так user_from-client/:id |
Цитата:
Если идеологически у тебя есть какие-то "юзеры" (х/з как определяемые) - ты так же можешь определить на какие ИД (подключения) отсылать или не отсылать сообщения. |
ksa,
Вся проблема в том, что не из документации, не из примеров в инете я не могу найти пример как вытащить id конкретного соединения т.е алгоритм примерно такой: при соединение у меня отсылается типа ник. socket = io("https://example.com:8443", { auth: { token: "example_user" } }); и в сокет он доступен по socket.handshake.auth.token socket.on("message", (data) // формат data [user_from, user_to, msg] for (тут перебираем массив сокетов) // вот тут я не понимаю какой массив брать. if (socket.handshake.auth.token == data.user_to) //берём id сокета и отсылаем io.sockets.sockets[id].emit('message', data.msg... |
HotReboot,
неправильно так идентифицировать с помощью ника пользователя socket.io - говно еще то может работать в нескольких режимах transports "polling", "websocket" по дефолту это polling, а в режиме websocket оно не работает по умолчанию причем в режиме polling можно отпровлять заголовки header, а в websocket такого они не реализовали к чему я это все вам нужен transport websocket и в этом режиме вызывать auth где использовать обычный jwt токен для идентификации, всем остальным дисконнект у клиента может быть несколько сессий примерно так const Connections = new Set(); socket.on('auth', token => { const user = verifyToken(token); if (user) { socket.user = user; Connections.add(socket); redisPub.sadd("users", user.id); } else { socket.emit('error', {message: 'UNAUTHORIZED'}); socket.disconnect(); } }) //-------- const send = (msg, users) => { Connections.forEach(socket => { if ('user' in socket && users.includes(socket.user.id)) { socket.emit('message', msg); } }); }; при этом стоит использовать хотя-бы redis для маштабирования Использование Redis в качестве брокера сообщений стр 357 Каскиаро М., Маммино Л. Шаблоны проектирования Node.js / пер. с анг. А. Н. Киселева. – М.: ДМК Пресс, 2017. – 396 с.: ил. |
Vlasenko Fedor,
Это вы мне примерно уже отвечали. Только вот websoket при close рвёт все соединения в вкладках. Точнее так - если открыты 3 вкладки и одна пересоединилась, то в других соединения порвутся. |
Цитата:
Открываю несколько вкладок везде connect и auth Принудительно перерезагружаю одну, закрываю все остальные работают(принимают и отправляют) каждая вкладка это отдельный сокет с одним и тем же user, но разным socket.id потому привел пример как отослать сообщения всем сокет сеансам одного (нескольким) пользователя (..лям) |
Vlasenko Fedor,
Да и мне бы разобраться хотя бы с этим, а вы мне ещё redis подбрасываете. У меня есть-то 10 юзеров да сервер с 1 ядром и 1 гигабайтом. |
Часовой пояс GMT +3, время: 03:35. |