Есть ли способ поделиться сокетным соединением между вкладками браузера?

Некоторые люди уже задавали этот вопрос в некоторых других местах, я просто не уверен, существует ли он здесь. В любом случае, я использую 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 с сервером, а затем сервер просто отдельно обменивается данными с каждым окном браузера. Если некоторую информацию из одного окна необходимо синхронизировать с другим окном, то вы можете написать свой сервер, чтобы поддерживать актуальность этих данных.

Другие вопросы по тегам