web-dev-qa-db-ja.com

ページ間のWebSockets接続を維持する方法は?

私のスクリプトの1つにこのコードがあります。

var webSocket = window.WebSocket || window.MozWebSocket;
window.ws = new webSocket('ws://64.121.210.140:2585/consoleappsample', 'my-protocol');

それはうまくいきます。ただし、ユーザーがページを変更すると、接続を再確立する必要があります。クライアントがサーバーにデータを送信してからページを変更すると、データが受信されず、競合状態が発生するため、コードで問題が発生していると思われます。

window.wsはグローバルスコープですが、問題を解決するようには見えませんでした。 WebSockets接続をページ間で維持する方法はありますか?そのため、接続を常に再確立する必要はありませんか?

30
Ryan Peschel

あなたが言及したグローバルスコープは常にJavaScriptコンテキストに関連しており、コンテキストは各ウィンドウに対して作成されます(そしてドキュメントがメモリからアンロードされると破棄されます)。したがって、あなたの努力は無用です。ユーザーがページを変更すると、接続を開いたままにできません。もちろん、Webアプリケーションを「単一ページ」アプリケーションとして使用できます。このアプリケーションでは、XMLHttpRequest/ajax/WebSocketを使用してすべてのデータがロードされます。したがって、ページを離れるということは、アプリケーションを離れる/シャットダウンすることを意味し、ソケットを閉じる意味があります。

別の古いアプローチでは、ページをフレームに配置し、ユーザーがフレーム内でのみナビゲートすることもできます(ウィンドウのサイズ全体を使用する場合でも)。その方法で、一番上のウィンドウでWebSocketを作成できます。これは変更されません(つまり、ロケーションバーに表示されるURLは常に同じになります)。

そうは言っても、@ dystroyに同意しました。アプリケーションは常にこのシナリオを処理できる必要があります。ユーザーがネットワークの問題を抱え、ページを離れなくても、しばらく接続が失われる可能性があります。

24
ZER0

残念ながら、SPAアプリケーションでサイトを変更しない最もクリーンなソリューションは、バックグラウンドで(タブを閉じた状態でも)ジョブを実行し、複数のタブの問題も解決するため、たった1つのServiceWorkerを使用して得られます。ほとんどのブラウザと互換性がないため、「残念」と言いました。私が見つけた唯一の解決策は、サーバー側でソケットチャネルをグループ化し、ページを変更することで失われたメッセージを保持するためにキューを作成することです。この場合、仮想チャネルのようなものがあります。

1
Marcello Kad