私は通信する必要があるツールに取り組んでいます。インターネット経由でツールの他のリモートインスタンスとファイルを送受信します。この場合、どの通信オプションを使用するのが最適でしょうか? ソケット?
6 に答える
ソケットは間違いなく行く方法ではありません。代わりに、FTP や HTTP など、既存の上位層プロトコルを使用する必要があります。ソケットは、裸の TCP/IP 機能のみを公開します。したがって、ファイルを送受信するには、アプリケーションロジックを自分で追加することになります (たとえば、失われたパケットに対処する必要があります)。上位層のプロトコルはすでにこれを行っています。
HTTP に関する 1 つのポイントは、優れた成熟した (多かれ少なかれ) セキュリティ監査済みの HTTP クライアントおよびサーバー ライブラリが、ほぼすべての言語またはプラットフォームで利用できることです。これにより、独自のビルドとデバッグの労力を節約できます。また、HTTP サーバーが公共のインターネットに公開される可能性がある場合、セキュリティは重大な問題になります。
編集: C# の場合は、より高いレベルのプロトコルもサポートするWindows Communication Foundationを試すことができます。
他の回答に対するコメントから、ファイルトランスポートとファイル暗号化を混同しているように思われます。他の人が指摘しているように、HTTPまたはFTPを使用してファイルを転送できます。HTTPは、サーバーを認証し、トラフィックを暗号化し、(もう少し作業を加えて)クライアントを認証できるSSL上ですでに機能しています。
ファイル自体も暗号化する場合は、PGP(またはGPGなどの実装)など、すでに存在するものを使用するのが最善の策です。S / MIMEを確認することもできますが、PGPの方が簡単です。独自の暗号化を再発明する場合、回避するのが難しいと思われる落とし穴が多すぎます。
それは、動作している環境に大きく依存します。TCP ソケットは、読み取りと書き込みが成功していることを確認する限り、非常に簡単に使用できます。ただし、ファイアウォールで問題が発生したり、両端で raw バイトのストリームを処理したくない場合があります。その場合、HTTP や FTP などのより高いレベルのプロトコルがより良い解決策になる可能性があります。
また、作業している言語と、そのライブラリ内の特定のプロトコルに対してどのようなサポートが提供されているかによっても異なります。
インスタンス間の単純なファイル転送だけが必要な場合は、使用している言語で利用可能な tftp クライアント/サーバー ライブラリを調べることをお勧めします。
インターネット全体で任意のマシンへのインバウンド接続を確立できると期待するべきではありません。ファイアウォール ポリシーがほぼ確実に邪魔になります。
したがって、ツールのすべてのインスタンスが接続し、他のインスタンスが後でダウンロードするためにファイルをアップロードできる中央サーバーを用意した方がよいでしょう。
他の回答によると、低レベルのソケット接続はお勧めしません。おそらくHTTPが正しい方法でしょう。