2015-05-22 3 views
1

Представьте себе этот сценарий:Как я могу различать и восстанавливать два разных клиентских сокета с одного и того же пользователя при перезагрузке сервера?

Клиент открывает вкладку браузера и переходит на страницу-x. Когда клиент находится на этой странице, я выдаю некоторые данные через сокет, связанный с этой страницей. Давайте назовем этот сокет-контекст-х.

Затем клиент открывает другую вкладку браузера (без закрытия первой) и переходит на страницу-y. Он подключается к новому идентификатору сокета. Я начинаю излучать разные данные, когда клиент находится на этой странице. И давайте назовем этот сокет-контекст-у.

Теперь представьте, что сервер перезагружен, а вкладки клиента автоматически подключаются к серверу. Теперь я должен помнить контексты для каждой из этих вкладок, у которых были соединения сокетов, поэтому я могу возобновить передачу соответствующих данных на каждую страницу.

Как бы я различал контекст сокета, на котором была установлена ​​каждая вкладка?

Я не могу использовать идентификаторы сеанса, так как идентификатор сеанса будет одинаковым для обеих вкладок. Я не могу использовать идентификаторы сокетов, потому что после перезагрузки сервера и при повторном подключении клиентов будут указаны новые идентификаторы сокетов.

+0

Я думаю, вы не можете, не с сервера, по крайней мере. Вы должны делегировать задачу идентификации на стороне клиента. Сообщите клиенту сервер, на котором он остановился, и какие соответствующие данные начнут отправлять снова. – laggingreflex

+0

Спасибо @laggingreflex Клиент должен будет отправлять запросы каждые x секунд для этого. Я хочу этого избежать. Приложение больше похоже на то, что сервер толкает данные. Когда сервер перезагружается, он должен оставаться там, где он остановлен. Тем не менее, я только видел в журналах, что новый запрос сокета также отправляет файл cookie с идентификатором предыдущего запроса на сокет (я использую salisjs для бэкэнд-фреймворка). Если это действительно так, я могу это использовать. Я увижу. – Nihat

+0

Этот идентификатор предыдущего запроса был id от последней вкладки, открытой пользователем, и поэтому она одинакова для обеих вкладок при их повторном подключении. Таким образом, это бесполезно. – Nihat

ответ

1

Я решил эту проблему, испустив событие на connect обратном вызове на сервере при повторном подключении браузера, таком как socket.emit("tellMeYourContext", null). Затем клиенты, слушающие это событие, посылают мне контекст, в котором они находятся, делая socket.emit("resumeContext", contextObj). Затем я знаю, в каком контексте каждый клиент и его вкладки включены, и может возобновить чередование соответственно.

Спасибо @laggingreflex за вдохновение.

Смежные вопросы