2011-09-07 31 views
11

私はnode.js/socket.ioを使ってチャットサーバーを検討していました。私はそれをtcpサーバーまたはhttpサーバーにする必要がありますか?私はTCPサーバがより効率的だろうと思うだろうが、添付ファイルのようなものに他のものを送ることができますか? tcpがより効率的であれば、どれくらいですか?また、どれだけの同時接続がnode.jsサーバーで処理できるのでしょうか?それはTCPまたはHTTPを行うための多くの仕事ですか?ディスカッション:node.js経由のチャットサーバー:HTTPまたはTCP?

答えて

25

ここでは全く異なる2つのアプローチについて言及しています.TCPはトランスポートレイヤプロトコルで、HTTPはアプリケーションレイヤプロトコルです。 HTTP(通常)はTCP上で動作します。したがって、どちらのオプションを選択してもTCP上で動作します。

あなたが異なるOSI layersについて話しているので、効率の質問は、議論の余地がポイントのようなものです。生のTCPソケットを使用した場合、HTTPには、チャットの規模に応じて、余分なデータ(ヘッダー)が含まれている可能性が高いため、プログラム)。あなた自身のアプリケーション層プロトコルがあります。

あなたはTCP上で、あなたが好きなものを送ることができます - すべてのHTTPは、添付ファイルを送信することができた後、それはTCP上で動作します。 FTPはTCP経由でも動作し、純粋に「添付ファイル」を転送するために設計されています。これを行うには、リモートパーティーに次のデータがファイルであることを伝えてからファイルデータを送信し、転送が完了したことをリモートパーティーに伝えることができるように、プロトコルを記述する必要があります。これの実装は多種多様です(HTTPのアプローチはFTPのアプローチとはまったく異なります)、あなたのオプションはかなり無限です。

私はNode.jsの接続制限について確かなことはわかりませんが、私はそれは、オペレーティング・システムによって制限されている信頼のかなりの量を持って言うことができます。 Thisは、その質問に対する答えを把握するのに役立ちます。

TCPまたはHTTPでそれを行うにはより多くの仕事であるかどうか議論の余地がある - 両方でそれをやるべき仕事がたくさんあります。おそらく、TCPオプションがあなたの最良の賭けになるようにもっと傾けたいでしょう。 TCPはアプリケーションだけでなくプロトコルを設計する必要がありますが、HTTPはチャットサーバーのような2ウェイアプリケーションには特に適していません。 HTTP経由でAJAXを使用するチャットの実装はたくさんありますが、私は痛い経験から、彼らが後端で完全な痛みであることを伝えることができます。

ブラウザであることをエンドポイント(すなわち、クライアント)を意図している場合、私はあなただけのHTTPを見てしなければならないと言うでしょう。エンドポイント用のデスクトップアプリケーションを作成する場合は、直接TCPリンクを使用してください。これの主な理由は、HTTPがリクエスト/レスポンス方式で動作し、クライアントがサーバに要求を送信し、サーバが応答することです。 TCPを介して、双方向通信に使用できる単一のTCPストリームを開くことができます。これは、サーバーがクライアントに即座にイベントをプッシュできることを意味します.HTTPでは、クライアントがリクエストを送信するのを待たなければならないので、イベントで応答することができます。クライアントとしてブラウザを使うつもりならば、ファイル転送の全体をはるかにトリッキーにするでしょう(少なくとも送信する)。

はロングポーリングとサーバープッシュ(read this)を使用して、HTTP経由でこれを実装する方法がありますが、それは本当の痛みを実装することができます。

これをLAN上(あるいはインターネット上でさえも)に実装しようとするならば、UDP over TCPを検討する価値があります - チャットアプリケーションでは、メッセージが正しい順序で到着することは絶対に重要ではありません。たとえそれがあったとしても、ユーザーはおそらくネットワーク待ち時間の変動(おそらく< 100ms)よりも速く入力することはできません。その後、ファイル転送のために、FTPのようなデータ交換のための別個のTCPソケットをネゴシエートするか、TFTPのような何らかの種類のUDP ACKシステムを実装することができます。

私はこのテーマについてもっと多くのことを感じていますが、今は言葉にすることができません - 私はいつかこの答えを広げるかもしれません。

+0

node.js/socket.ioクライアント側でtcpを実行する方法はありますか?私はこの質問もここに記載しています:http://stackoverflow.com/questions/7340475/client-side-tcp-with-node-js-socket-io – Derek

+0

btw。たくさん説明してくれてありがとう。その助けをたくさん。しかし、udpとtcpよりも利点/短所についてもっと詳しく説明できますか?本当にありがとう! – Derek

+0

udpパケットの損失はチャットアプリに影響しますか? – Derek

2

チャットサーバーは、ノード内のHello Worldプログラムです。 httpを使用してください。

どのように多くの同時接続が処理できるのかということは、システムによって異なります。シンプルなチャットサーバーをセットアップし、それをベンチマークしてみてください。

また、http://search.npmjs.org/をチェックし、いくつかのポインタについてchatを検索してください。

関連する問題