現在、これを行う通常の方法は、 Cometとしても知られる「ロングポーリング」を使用することだと思います。さまざまな具体的な手法がありますが、基本的な考え方は、ブラウザーがサーバーに要求を送信し、サーバーはブラウザーに送信するものがあるまで接続を開いたままにしておくというものです。たとえば、Gmail では、ブラウザー アプリがすぐに受信トレイにある次の新しいメッセージを要求する場合があります。サーバーは、新しいメッセージが実際に受信トレイに届くまでに 30 分かかるため、それを送信する前に 30 分待つ場合があります。
技術的には、これは依然としてクライアント主導ですが、クライアントの「要求」は、実際には、サーバーが選択した将来の時点でクライアントにデータを送信する機会をサーバーに提供するだけです。
ロング ポーリングを使用すると、ほとんどの場合、サーバーには多くの保留中のリクエストがアイドル状態になります。 サーブレット API のバージョン 3では「非同期サポート」が導入されました。これにより、スレッドは要求を保留にし、最初の要求が待機している間に他の要求を処理できます。古い API バージョン用に作成されたサーブレットは、それほどうまくスケーリングできません。service()
メソッドは、応答が生成されるまで返されてはならず、応答するまで待機するだけのスレッドを結び付けなければならないからです。あるいは、Tomcat にはComet 用の特別な拡張機能があり、イベント駆動型 I/O を使用して、サーブレットが同じスレッドで同時に多くの要求を処理できるようにします。他のサーブレット コンテナが同様の拡張機能を提供する場合があります。
HTTP のオーバーヘッドなしで永続的な接続を介した双方向通信を可能にするWebSocketsと呼ばれる新しいプロトコルがありますが、まだ広くサポートされていません。