2017-12-11 6 views
-1

私は今すぐウェブサイトを持っています。それはexpressを使用するとうまくいきます。私はrouter.getsと投稿をたくさん持っています。私はreq.user.usernameを使ってユーザーのユーザー名にアクセスできるようにmongodbも使用しています。socketioをサーバー全体に実装せずにチャットを行うことはできますか?

ここで、サーバー全体のsocketioを実装することなくチャットを行いたいと思います。私はちょうど必要ないときに実行しているsocketioを必要とせず、チャットを持っているページでしか動かない。

私の現在のアイデアはこうです:ユーザーが「getChat」リクエストを行うたびに、チャットにJSONオブジェクトとして送信します。その後、最初のチャット・レンダリングの後、ユーザーに「waitChat」リクエストを呼び出させます。誰か他の人がメッセージを送信する投稿要求をしたら、私は "waitChat" getリクエストでres.sendするか、waitChat res.sendに "success" msgをつけて、別の "getChat"リクエストを作成させます。それは無限のサイクルにしてください。

+0

基本的には、クライアントとサーバー間の接続が、接続されたクライアントにメッセージを「プッシュ/ブロードキャスト」する「何か」よりも必要です。その「何か」は、クライアントとサーバーの間のアクティブな接続である「ソケット」です。 2番目の部分で述べたことは、基本的にはあなたが "socket.io"というフレームワークをすでに持っている "socket"の実装です。 – Vishrant

+0

申し訳ありませんが、私はsocketioをこのために使用すると思いますが、socketioに接続すると、どのようにユーザーのユーザー名を取得できますか? 問題は私がsocketioを好きではないのですが、現在のエクスプレスセットアップをどのように組み合わせるか分かりません。ソケット接続ごとに – anduyang

+0

というIDが割り当てられていますので、どちらのIDを使用して接続されています。利用可能な多くの例がありますが、ソケットioを使用した高速でのGoogleチャットの例があります。 – Vishrant

答えて

0

ここで、サーバー全体のsocketioを実装することなくチャットを行いたいと思います。

いいえ、あなたはそうすることはできません。どこのWebページでチャットサーバーに接続しようとしているのか、あなたのサーバーはまったく分かりません。あなたはいつも聞いている必要があります。

また、接続のないリッスンサーバーが何もしていないため、何の費用もかからないため、受信socket.io接続をリッスンすることが何を意味するのか誤解しているようです。だから、「常に走っている」とは何も意味しません。実際には、サーバーを起動したり、サーバーを停止したり、後で再起動するなど、リスニングのままにするよりも、さらに多くのコストがかかります。私のサーバー全体にsocketioを実装しなくても、あなたの言いたいことは、聞いているsocket.ioサーバを持っているだけのことがあると思うように思えます。それはまったく重たい概念ではありません。

さらに、あなたのsocket.ioサーバーを常に聴いていることには欠点はありません。受信したsocket.io接続を、あらかじめ設定されたクッキーまたは他のauthメソッドを使用して認証する場合は、認証されたユーザーだけが接続できるように認証を実装できます。


私は、あなたがwaitChatとgetChatについて話していることにはあまり従いません。チャットの背景にある考え方は、userAがuserBに配信されるメッセージを送信できるということです。その仕組みは、userAがサーバーにメッセージを送信し、サーバーがuserBにメッセージを送信するという概念です。

明らかに、userAがサーバーにメッセージを送信するのは簡単です。それはどんな数の方法でも行うことができます。問題は、サーバーがuserBにメッセージをどのように配信するのかということです。あなたが知っていると思うように、サーバーはuserBに直接連絡することはできません。これを行う方法は以下のとおりです。

  1. userBが定期的にポーリングし、サーバが何か新しいものを求めて
  2. ユーザーBもポーリングしている「ロングポーリング」が、サーバーがしばらくの間、ポーリングリクエストに保持している特殊なバージョンを使用しています何らかのデータがあるかタイムアウトした後にクライアントが再度ポーリングする必要がある場合は返されます。
  3. userBはサーバーとの永続的なwebSocketまたはsocket.io接続を行い、サーバーはその接続を介してクライアントにデータを送信できます。どんなときも。

ウェブソケットまたはソケット。2つのポーリングスキームがあまり効率的でもスケーラブルでもないため、すべてのコンセプトが発明されてブラウザに追加されました。

+0

申し訳ありませんが、私はsocketioをこのために使用すると思いますが、socketioに接続するとどのようにユーザーのユーザー名を取得できますか? 問題は私がsocketioを好きではないのですが、現在のエクスプレスセットアップをどのように組み合わせるかわかりません。 – anduyang

+0

@anduyang - cookieはsocket.io接続が接続されているときに利用できます。だから、あなたがHTTPリクエストを使っている人を知るのと同じ方法で、socket.io接続のために動作します。実際、socket.io接続はhttpリクエストで始まります(クッキーが利用できる理由です)。 – jfriend00

関連する問題