Как использовать *одно* соединение WebSocket на все вкладки?
Добрый день.
Хочу сделать так, чтобы мой сайт поддерживал web-socket соединение с сервером, но при этом только одно на все вкладки с моим сайтом.
Сразу вспомнился механизм общения между вкладками с помощью LocalStorage.
Но надежного механизма поддержания одного соединения я не придумал. Ведь пользователь может закрыть вкладку с соединением, нужно открыть новое. При этом вкладки должны как-то выбрать кто из них это сделает. И нужно чтобы сразу две не открыли.
Для моих представлений не хватает блокировок.
pqgg7nwkd4 костыли? Что именно BNC Connector? Так это реализация TCP/IP поверх cookie, а вот localStorage как раз глючная технология и без костылей там никак.
Ну раз хотите только одно соединение на браузер, то при закрытии вкладки в которой активно соединение, открывайте новое соединение в другой вкладке. В чём проблема?
Можно сделать например так:
При установке соединения в LS указываете ID вкладки и время последнего обновления состояния.
В других вкладках проверяете время последнего обновления состояния. Если оно больше определённого промежутка - выбираем новую вкладку и открываем там соединение. Ну и всё по новой.
У меня правда было всё немного по другому...
Я делал свой "транспорт" между вкладками браузера через LS и в итоге мог свободно общаться между вкладками... И при закрытии вкладки, я отправлял сообщение другой случайной вкладке в которой и открывалось новое соединение.
Вячеслав Юрьевич: Javascript в браузере работает в один поток, если поток заблокировать в одной вкладке то выполнение всех остальных подвиснет. Попробуйте, откройте две вкладки и в одной из напишите while(true) console.log('do work');
В другой напишите любой javascript код и обратите внимание, что он не будет выполняться. Никакого состояния гонки быть не может. Поток один.
pqgg7nwkd4: Да. Какой смысл при асинхронности иметь несколько потоков? Да даже если бы было несколько потоков, вы могли бы сделать простейший мьютекс на основе local storage.
Если у вас асинхронное подключение, то нужно сделать такой мьютекс, иначе с клиента может успевать уйти несколько запросов на подключение. Если подключение синхронное (блокирует поток), то никаких мьютексов не нужно.
Но вы же в курсе, что пользователь может открыть консоль браузера и вручную открыть столько соединений, сколько захочет (даже внутри одной вкладки), если этого не запрещает сервер?
Спасибо за пример.
К сожалению, идеального решения пока не найдено. Выборы, приоритеты - это выглядит не очень надежно, к тому-же LS при изменениях всегда пишет их на диск. А учитывая, что мое веб приложение будет использоваться постоянно, то и запись на диск будет постоянно, что не очень хорошо.