ブラウザのタブごとではなく、ブラウザごとに1つのソケットが必要です。どうすればそれを達成できますか?有望だった共有ウェブワーカーについて読んだ。そのためのリファレンスもありがたいです。残念ながら、私の知る限り、共有WebワーカーはまだmozillaまたはInternet Explorerに実装されていません。では、この場合はどうすればよいですか?サーバー側のnode.jsに取り組んでいます。
この質問を見て、ついに共有ソケットを実装し、数日前にライブラリに追加しました。 IE6を含むほとんどのブラウザーで動作するようですが、Operaを除きます。 Operaの場合、アンロードイベントの代わりに定期的なチェックを使用できます。
https://github.com/flowersinthesand/portal/issues/21 で関連する問題を確認してください
私の回答がお役に立てば幸いです。
場合によっては、タブ間の通信にlocalStorageオブジェクトを使用しました。 localStorageオブジェクトには、同じOriginの別のタブまたはウィンドウに一部のデータが変更されたことを通知するイベントシステムがあります( http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows -using-localstorage / )。アイデアは、ソケットのあるタブにタイムスタンプと受信したデータをローカルストレージに書き込ませることです。タイムスタンプが古すぎる場合-おそらくソケットのあるタブが閉じられているため-別のタブがソケット接続を開始し、データとタイムスタンプを更新できます。
EventEmittersと同じインターフェースを使用してタブ間でデータを送信するために、localStorageを共有通信チャネルとして使用しています。サーバーに接続するタブを決定するリーダー選出アルゴリズムと組み合わせて、すべてのフォロワーイベントからすべてのソケットイベントをリーダータブにリレーしたり、その逆を行ったりします。最後に、リーダータブはすべてのイベントをサーバーに転送し、受信したすべてのイベントを他のすべてのクライアントにブロードキャストします。これがコードです:
2016年の回答は、このブログに記載されている Shared Web Workers である必要があります。
https://blog.pusher.com/reduce-websocket-connections-with-shared-workers/
理想とはほど遠いですが、フラッシュローカル接続を使用して1つのWebSocket接続をセットアップし、それをタブや複数のブラウザーで共有できます。
詳細については、 http://help.Adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/LocalConnection.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6 を参照してください。
構築を開始する準備をしている設計について、私はまだこれを理論化しています。しかし、私は組み合わせることを考えています
-WebSockets -Local Storageおよび-Cross Window Messaging
私の理論では、すべてのタブですべてのページが読み込まれるときに実行されるソケットエンジンをJavaScriptで作成しますが、接続がすでに確立されている場合はシャットダウンします。
サイトへの最初のヒットで、GUIDを作成し、ローカルストレージに保存します。このGUIDは、ユーザーのPCへのブラウザー/ログインを一意に識別します。
ソケットサーバーが接続を受け入れると、そのGUIDが使用され、そのGUIDによる新しい要求は「999接続がすでに確立されています」などのようなものを返します。
1つが実行されると、タブ間で共有するデータをJSON blobに変換し、他のタブで受信したときにそれをオブジェクトに戻すことにより、他のタブにクロスウィンドウメッセージングをシードします。したがって、どのタブが接続であっても、ソケットサーバーですべての着信/発信メッセージを処理します。次に、クロスウィンドウメッセージングを介して他のタブで送受信します。そして理論的には、これはiframeやポップアップウィンドウでも機能するはずです。
このシステム全体は、私たちが構築しているCRMライクなシステムと、ライブチャットシステムおよびチケットボードのロードされたフォームの自動データ更新を実行します。
私の夢のシナリオは、ユーザーAがチケット1000を凝視し、ユーザーBがチケット1000を更新する場合、ユーザーAのチケットを更新したい場合、そしてユーザーAが更新前に変更を行った場合、吹き飛ばさないようにデータ移行ポップアップを提供したいです。ユーザーBが変更されました
-このレコードの編集中にユーザーBが競合する変更を行いました "ユーザーB:ファーストネーム->ボブ" [テイク] "ユーザーA:ファーストネーム->ロバート" [キープ]
現在、socket.ioを実装する方法に解決策があるように思わないでください。 this video、5番目のセグメントのGuillermo Rauchをチェックしてください。彼もそれを挑戦だと考えています。
https://github.com/nodeca/tabex を参照してください
クロス集計通信には追加のレイヤーが必要です。 TabexはFayeの使用例を持っています。他のwebsocketトランスポート(socket.ioなど)も同様に使用できます。
実際には、これらの問題のいくつかを回避することは困難です。たとえば、ネットワークが安定していないときに切断します。結局のところ、ページは、最初はさまざまなテキストドキュメント(RFCドキュメントなど)を交換することを目的としています。と不安定な転送アプローチ(私が思うにHTTP
プロトコルをセットアップする最初の目的)
もちろん、それを解決するには、上記のように共有ワーカーを使用するか、共有部分と公開部分の情報をLocalStorage
に保存することをお勧めします
LocalStorage
の基本的な使用法の紹介へのリンクは次のとおりです
それが本当にあなたを願っていることを願っています!(実際にはまだです)