ブラウザの複数のタブページ間の通信
2996 ワード
一、WebSocket WebSocketは、ブラウザとサーバの間で制限されない双方向通信のチャネルを確立するHTML 5の新しいプロトコルです.例えば、サーバはいつでもブラウザにメッセージを送信することができます. WebSocketはTCPプロトコル上に確立されている.TCPプロトコル自体はフルデュプレクス通信を実現しているが,HTTPプロトコルの要求−応答機構はフルデュプレクス通信を制限している.WebSocket接続が確立されると、次の通信はHTTPプロトコルを使用せず、直接データを送信します. 安全なWebSocket接続メカニズムはHTTPSと似ています.まず、ブラウザ用wss://xxxWebSocket接続を作成すると、まずHTTPSで安全な接続が作成され、その後、このHTTPS接続はWebSocket接続にアップグレードされ、下位通信は依然として安全なSSL/TLSプロトコルを実行します.
WebSocket接続はブラウザによって開始されなければならない.特徴:(1)TCPプロトコルに基づいて構築され、サーバ側の実現が容易である.(2)HTTPプロトコルとの互換性が良好である.デフォルトポートも80と443であり、握手段階ではHTTPプロトコルを採用しているため、握手時にマスクしにくく、各種HTTPプロキシサーバを通過することができる.(3)データフォーマットが比較的軽量で、性能コストが小さく、通信が効率的である.(4)テキストを送信してもよいし,バイナリデータを送信してもよい.(5)同源制限がなく,クライアントは任意のサーバと通信できる.(6)プロトコル識別子はws(暗号化されている場合はwss)であり,サーバURLはURLである.
二、SharedWorker
SharedWorkerはHTML 5に新しく導入された、共有可能なWeb Workerです.メッセージング:通常のWeb Workerはonmessageを介してイベントとpostMessageをリスニングしてデータを転送します.
shareWorkerでは、共有スレッドを作成できます.つまり、異なるページで同じShareWorkderを使用し、すべてのページが閉じられるとスレッドが終了します.メッセージング:shareWorker.port転送、使用方法は普通のworkerと似ています
メッセージイベントをaddEventListenerでバインドする場合(.onmessageではなく)手動でportを呼び出す必要がある.start()メソッド.
新しいshareWorkerへの接続はonconnectイベントで取得でき、connectのパラメータのportsフィールドでMessageEventを取得できます.マンモスとpostMessageは私たちのデータを処理し、伝達しました.
注意:SharedWorkerは複数のwindowで共通に使用できますが、これらのラベルページが同じソースであることを保証する必要があります.
三、localstorage
localstorageはブラウザの複数のラベルが共通する記憶領域であるため、マルチラベル間の通信を実現するために使用することができる(ps:sessionはセッションレベルの記憶領域であり、各ラベルページは個別である).
onstorageおよびstorageイベントは、いずれも現在のページではないlocalStorageを変更した場合にトリガーされ、現在のページ変更localStorageではリスニング関数はトリガーされません.次に、元のデータの値を変更するとトリガーされます.例えば、keyがa値bのlocalStorageを持っていた場合、localStorageを実行します.setItem('a','b')コードは、同様にリスニング関数をトリガーしません.
WebSocket接続はブラウザによって開始されなければならない.特徴:(1)TCPプロトコルに基づいて構築され、サーバ側の実現が容易である.(2)HTTPプロトコルとの互換性が良好である.デフォルトポートも80と443であり、握手段階ではHTTPプロトコルを採用しているため、握手時にマスクしにくく、各種HTTPプロキシサーバを通過することができる.(3)データフォーマットが比較的軽量で、性能コストが小さく、通信が効率的である.(4)テキストを送信してもよいし,バイナリデータを送信してもよい.(5)同源制限がなく,クライアントは任意のサーバと通信できる.(6)プロトコル識別子はws(暗号化されている場合はwss)であり,サーバURLはURLである.
二、SharedWorker
SharedWorkerはHTML 5に新しく導入された、共有可能なWeb Workerです.メッセージング:通常のWeb Workerはonmessageを介してイベントとpostMessageをリスニングしてデータを転送します.
// worker
let worker = new Worker('workers.js');
...
button.addEventListener('click', function () {
// worker
worker.postMessage('start');
});
worker.onmessage = function (messageEvent) {
alert(' , ' + messageEvent.data + ', ' + (new Date() - time) + 'ms');
}
...
//
worker.terminate();
shareWorkerでは、共有スレッドを作成できます.つまり、異なるページで同じShareWorkderを使用し、すべてのページが閉じられるとスレッドが終了します.メッセージング:shareWorker.port転送、使用方法は普通のworkerと似ています
let worker = new SharedWorker('sharedworkers.js');
// strat
worker.port.postMessage('start');
//
worker.port.onmessage = function (val) {
timeDom.innerHTML = val.data
}
メッセージイベントをaddEventListenerでバインドする場合(.onmessageではなく)手動でportを呼び出す必要がある.start()メソッド.
worker.port.start();
worker.port.addEventListener('message', function(e) {
// ...
});
新しいshareWorkerへの接続はonconnectイベントで取得でき、connectのパラメータのportsフィールドでMessageEventを取得できます.マンモスとpostMessageは私たちのデータを処理し、伝達しました.
// sharedworkers.js
onconnect = function (e) {
// e.ports port
var port = e.ports[0];
// port.onmessage
port.onmessage = function () {
// port.postMessage
port.postMessage(a++)
}
}
注意:SharedWorkerは複数のwindowで共通に使用できますが、これらのラベルページが同じソースであることを保証する必要があります.
三、localstorage
localstorageはブラウザの複数のラベルが共通する記憶領域であるため、マルチラベル間の通信を実現するために使用することができる(ps:sessionはセッションレベルの記憶領域であり、各ラベルページは個別である).
// A
function sendMsg(text) {
window.localStorage.setItem('msg',text);
}
// B
window.addEventListener('storage', function (evt) {
if(evt.key==='msg')
console.log(evt.newValue);
});
onstorageおよびstorageイベントは、いずれも現在のページではないlocalStorageを変更した場合にトリガーされ、現在のページ変更localStorageではリスニング関数はトリガーされません.次に、元のデータの値を変更するとトリガーされます.例えば、keyがa値bのlocalStorageを持っていた場合、localStorageを実行します.setItem('a','b')コードは、同様にリスニング関数をトリガーしません.