Сервер 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 гигабайтом. |
уберите тогда редис
пользователи если идентифицированные работаете с их идентификаторами, токенами, cookies, ключами тем, что используете при идентификации const socket = io('youHost', { "transports": ['websocket'] }); только так, вы используете вебсокеты, иначе пингуете сервак обычными аякс запросами каждая вкладка, браузер, клиент - это новая сессия вебсокета |
Vlasenko Fedor,
Вы слишком не понятно для меня объясняете. Если бы я был уровнем выше, то я бы и на задавал такие вопросы. |
Цитата:
const express = require('express'), app = express(), http = require('http').createServer(app), io = require('socket.io')(http) const host = '127.0.0.1' const port = 7000 let clients = [] io.on('connection', (socket) => { // Вот же он - socket.id console.log(`Client with id ${socket.id} connected`) clients.push(socket.id) socket.emit('message', "I'm server") socket.on('message', (message) => console.log('Message: ', message) ) socket.on('disconnect', () => { clients.splice(clients.indexOf(socket.id), 1) console.log(`Client with id ${socket.id} disconnected`) }) }) https://nodejsdev.ru/doc/websocket/ |
Цитата:
Там все соединения сами по себе. |
ksa,
Это для дисконект как я вижу. А отсылает в этом коде всем. |
Цитата:
Все остальное смотри по ссылке, что я давал уже 2 раза (см.выше). |
ksa,
Я, за последние двое суток, перелопатил советов которых хватит на "Войну и Мир". я уже весь запутался, потому как одни советы такие, другие такие и всё это не работает нужным мне образом. Или уже глаз замылися, что я не так понимаю, либо одно из двух. Уже даже к фрилансерам сбегал и бесполезно. |
ksa, Vlasenko Fedor,
Кстати отправка одному пользователю по id. io.sockets.connected[id].emit... io.sockets.sockets[id].emit... io.sockets.client[id].emit... которыми пестрит весь интернет приводили к ошибки и только где-то на задворках нашёлся рабочий io.to(id).emit... Подразумеваю, что-то с версиями связанно. |
Часовой пояс GMT +3, время: 14:13. |