Есть ли способ поделиться сокетным соединением между вкладками браузера?
Некоторые люди уже задавали этот вопрос в некоторых других местах, я просто не уверен, существует ли он здесь. В любом случае, я использую Primus.io
с engine.io
как это трансформер. Мне интересно, возможно ли иметь общий доступ к веб-сокету в браузере (клиенте). Например, если я подключил одного клиента и подключил другого на другой вкладке. В идеале они должны получить такое же соединение, чтобы, если я отправлю что-то через сокет, обе вкладки могли бы получить сообщение.
Другие упоминали об использовании localStorage
как способ обмениваться / передавать одни и те же данные на разных вкладках, но я просто не нахожу их аккуратными.
Ваша помощь очень ценится.
Лучший,
2 ответа
Каждая вкладка будет иметь отдельное соединение с сервером и имеет уникальный идентификатор сокета.
Если вы хотите отправить сообщение в каждый сокет для идентификатора пользователя или идентификатора сеанса, вам нужно что-то, чтобы сопоставить пользователя или сеанс с несколькими соединениями сокетов.
В Socket.IO у них есть понятие "комната".
На connection
Вы можете добавить розетку в комнату. В этом примере используется групповое имя пользователя passport.js.
io.on('connection', function(socket){
socket.join(socket.request.user.username);
});
Затем вы можете отправить сообщение на все розетки для этой комнаты.
io.to(username).emit('some event'):
Socket.IO убирает комнату на disconnect
для тебя.
https://github.com/cayasso/engine.io-rooms - это реализация комнат для engine.io, которая может оказаться полезной.
Проще говоря
- При подключении вы хотите добавить новый сокет в список сокетов для пользователя.
- При отключении вы хотите удалить сокет из списка сокетов для пользователя.
- При emit вы хотите отправить сообщение всем сокетам в списке для пользователя.
Если код в ваших двух вкладках взаимодействует, можно обмениваться данными из соединения webSocket на одной вкладке с другой вкладкой. Когда откроется вкладка, ей нужно будет выяснить, открыта ли какая-либо другая вкладка с существующим подключением к webSocket, а затем попросить эту вкладку поделиться своими данными с новой вкладкой. Это не тривиальная операция, поскольку окна браузера не имеют простого способа узнать о других окнах браузера, если только новое окно не было открыто сценарием предыдущего окна, а не было открыто пользователем.
Но если каждое из ваших окон просто пытается установить соединение webSocket с сервером, каждое из них получит свое собственное соединение webSocket. Автоматическое совместное использование соединений webSocket между вкладками отсутствует.
Кстати, обычное поведение здесь заключается в том, что каждое окно просто получает свое собственное соединение webSocket с сервером, а затем сервер просто отдельно обменивается данными с каждым окном браузера. Если некоторую информацию из одного окна необходимо синхронизировать с другим окном, то вы можете написать свой сервер, чтобы поддерживать актуальность этих данных.