web-dev-qa-db-ja.com

プッシュ通知の場合、websocketは必須ですか?

サーバー側にPHPがあり、クライアント側にHTMLとjavascriptがあります。

関係者がグループの複数の受信者にリアルタイムでブロードキャストされるメッセージを入力するアプリを作成しています。

Googleでいくつかの調査を行いましたが、リアルタイムのプッシュ通知にはWebSocketsまたはCometを使用する必要があることを理解しています。 WebSocketまたはCometは、ユーザーに大量の通知を送信するために必須ですか?

私の理解は正しいですか?最初に参照するものはありますか?

26
John Franky

クライアントがブラウザの場合、標準ブラウザがサーバーに接続できるのは、Ajax(httpなど)リクエストまたはwebSocket接続を介した2つの方法のみです。そのため、クライアントに外部の世界から何かの通知を受け取りたい場合は、これら2つのメカニズムのいずれかを使用する必要があります。

HTTPリクエストは一時的です。クライアントはサーバーにリクエストを行い、サーバーは応答します。 HTTP要求は、サーバーから情報を要求するクライアントに最適です。通常、クライアントは接続されていないため、サーバーはクライアントに情報を送信するのが得意ではありません。クライアントが一定の間隔でサーバーを「ポーリング」するハッキングと回避策があり、サーバーが「プッシュ」タイプのシステムをシミュレートするために実行時間の長い要求を使用することもありますが、それらはせいぜい次善のハッキングです。

webSocketsは連続接続です。クライアントが接続し、両側が望む限り接続はそのままです。これにより、どちらの側でも、必要なときにいつでも相手側にメッセージを送信できます。つまり、サーバーはいつでもクライアントにデータを「プッシュ」できます。 webSocketはプッシュ接続に効率的であり、推奨されます(これは、設計された主なものの1つです)。

Cometは、webSocketが発明されてから広くサポートされる前に、HTTPを使用してプッシュを「ハッキング」または「シミュレート」しようとするために元々構築されたライブラリです。 webSocketがサポートされていない古いブラウザを使用しない限り、webSocketの代わりにCometを使用する理由は考えられません。

したがって、ブラウザに「リアルタイムサーバープッシュ」を実行しようとしている場合は、webSocket(または、socket.ioのようなwebSocketの上に構築されたもの)を意味する、クライアントから継続的に接続されたソケットが必要です。

電話SDKにアクセスできる電話アプリの場合、OSに組み込まれた「プッシュ」システムを使用して、サーバーからクライアントにメッセージをプッシュできます。これは双方向のwebSocketチャンネルとはまったく同じではありませんが、「プッシュ通知」について尋ねたので、AndroidとIOSの両方で利用可能なOSプッシュサービスもサーバーからクライアントに通知をプッシュするオプション。 iOS通知 および Googleクラウドメッセージング に関する情報はこちら

2016年の時点で、Microsoftブラウザーを除くすべての最新ブラウザー(Edgeではまだサポートされていません)で Server-sent events を使用することもできますまたはIE)サーバーからクライアントにデータをプッシュします。 ブラウザ互換性テーブル です。サーバー送信イベントは、いつでもサーバーからクライアントにイベントを送信できるように、長続きするHTTP接続、特別なMIMEタイプ、およびサポートするクライアントを使用します。 webSocketとは異なり、サーバー送信イベントは一方向のみです(サーバーからクライアントへ)。クライアントは、サーバーにデータを送信できるようにするために、従来のAjax呼び出しを使用します(一方、webSocketを使用すると、同じwebSocket接続を介してデータを送信できます)。

サーバー送信イベントがどのように機能するかについての適切な説明を次に示します。 サーバー送信イベントは実際にどのように機能しますか?

43
jfriend00

WebSocketsを使用することは、他のオプションと比較してより効率的な方法であることをお勧めしますが、これはなぜですか?クライアントがサーバーに変更があるという通知を受け取った場合、その変更を取得するためにサーバーへのAJAX呼び出しを作成する必要はありません。同じ変更でクライアントに送信できます。 AJAXよりも簡単なwebSocket接続:これは、効率的なコードとより高速なアプリケーションの実行を意味します!

0
Libby Lebyane

クライアントアプリケーションはSPAですか? (シングルページアプリケーション)?そうでない場合は、クライアントがページを変更するたびにwebsocketサーバーとの接続が失われることを考慮する必要があるため、非常に重要です。この場合、1つのクライアントが切断されたときに利害関係者がマルチキャスト要求を送信すると、クライアントは何も受信しないため、キューを管理する必要があります。ポーリングでもこの状況は解決されず、一般的なインターネットプランのモバイルクライアント(たとえば)が不要な「ping」トラフィックのためにメガバイトを消費するため、これは恐ろしいソリューションです。ポーリングの本当の例は、車に乗った子供が父親に1分ごとに目的地に到着したかどうかを尋ねることです!だから、スパを使わずに解決策はありますか?はい、利害関係者とクライアント間で「共有ストレージ」を使用し、オンラインクライアント「ウェイクアップ」のみにwebsocketを使用します。

クライアントがページを開くたびに、ストレージから取得された未読通知もバックエンドから受信します。利害関係者が何かを通知する場合、通知メッセージを共有ストレージに保存し、「パルス」を通知サーバーに送信します。通知サーバーは、「パルス」をオンラインクライアントに転送します(誰かがページを読んでいない場合に備えて)。クライアントがページを変更しているために「パルス」が失われた場合、クライアントはストレージから通知を受け取るため問題はありません。すべてのページには、次のロジックが含まれます。番号の取得または未読通知(サーバー側)5秒後に通知サーバーに接続します(JavaScript側)。それが役に立てば幸い。

0
Marcello Kad