ここで、サーバー全体のsocketioを実装することなくチャットを行いたいと思います。
いいえ、あなたはそうすることはできません。どこのWebページでチャットサーバーに接続しようとしているのか、あなたのサーバーはまったく分かりません。あなたはいつも聞いている必要があります。
また、接続のないリッスンサーバーが何もしていないため、何の費用もかからないため、受信socket.io接続をリッスンすることが何を意味するのか誤解しているようです。だから、「常に走っている」とは何も意味しません。実際には、サーバーを起動したり、サーバーを停止したり、後で再起動するなど、リスニングのままにするよりも、さらに多くのコストがかかります。私のサーバー全体にsocketioを実装しなくても、あなたの言いたいことは、聞いているsocket.ioサーバを持っているだけのことがあると思うように思えます。それはまったく重たい概念ではありません。
さらに、あなたのsocket.ioサーバーを常に聴いていることには欠点はありません。受信したsocket.io接続を、あらかじめ設定されたクッキーまたは他のauthメソッドを使用して認証する場合は、認証されたユーザーだけが接続できるように認証を実装できます。
私は、あなたがwaitChatとgetChatについて話していることにはあまり従いません。チャットの背景にある考え方は、userAがuserBに配信されるメッセージを送信できるということです。その仕組みは、userAがサーバーにメッセージを送信し、サーバーがuserBにメッセージを送信するという概念です。
明らかに、userAがサーバーにメッセージを送信するのは簡単です。それはどんな数の方法でも行うことができます。問題は、サーバーがuserBにメッセージをどのように配信するのかということです。あなたが知っていると思うように、サーバーはuserBに直接連絡することはできません。これを行う方法は以下のとおりです。
- userBが定期的にポーリングし、サーバが何か新しいものを求めて
- ユーザーBもポーリングしている「ロングポーリング」が、サーバーがしばらくの間、ポーリングリクエストに保持している特殊なバージョンを使用しています何らかのデータがあるかタイムアウトした後にクライアントが再度ポーリングする必要がある場合は返されます。
- userBはサーバーとの永続的なwebSocketまたはsocket.io接続を行い、サーバーはその接続を介してクライアントにデータを送信できます。どんなときも。
ウェブソケットまたはソケット。2つのポーリングスキームがあまり効率的でもスケーラブルでもないため、すべてのコンセプトが発明されてブラウザに追加されました。
基本的には、クライアントとサーバー間の接続が、接続されたクライアントにメッセージを「プッシュ/ブロードキャスト」する「何か」よりも必要です。その「何か」は、クライアントとサーバーの間のアクティブな接続である「ソケット」です。 2番目の部分で述べたことは、基本的にはあなたが "socket.io"というフレームワークをすでに持っている "socket"の実装です。 – Vishrant
申し訳ありませんが、私はsocketioをこのために使用すると思いますが、socketioに接続すると、どのようにユーザーのユーザー名を取得できますか? 問題は私がsocketioを好きではないのですが、現在のエクスプレスセットアップをどのように組み合わせるか分かりません。ソケット接続ごとに – anduyang
というIDが割り当てられていますので、どちらのIDを使用して接続されています。利用可能な多くの例がありますが、ソケットioを使用した高速でのGoogleチャットの例があります。 – Vishrant