カスタム FTP ライブラリを使用する ac# アプリケーションがあります。現在、Socket.Send を使用してデータを送信していますが、ソケットで NetworkStream を開始し、代わりに NetworkStream.Write を使用する方がよいかどうか疑問に思っていました。
一方を他方よりも使用する利点はありますか?
カスタム FTP ライブラリを使用する ac# アプリケーションがあります。現在、Socket.Send を使用してデータを送信していますが、ソケットで NetworkStream を開始し、代わりに NetworkStream.Write を使用する方がよいかどうか疑問に思っていました。
一方を他方よりも使用する利点はありますか?
の利点は、NetworkStream
主にそれが であるという事実に由来しStream
ます。の欠点は、 のSocket
ような抽象的な I/O ソースから読み書きする一般的なコードが をStream
処理できないことSocket
です。
a の主な使用例は、 aNetworkStream
から読み書きするコードが別の場所にありStream
、それを a で使用したい場合ですSocket
。このような状況にある場合はNetworkStream
、大きな助けになるでしょう。
たとえば、通信ライブラリがあり、ファイル、名前付きパイプ、および TCP/IP からのメッセージのシリアル化をサポートしているとします。I/O クラスの理想的な選択肢はStream
. 次に、シリアル化メソッドが a FileStream
、 a PipeStream
、または aを受け入れることができますNetworkStream
。.を受け入れることさえありMemoryStream
ます。これは抽象化の利点です。ストリームを作成した後、メソッドはストリームの種類を知らなくてもストリームと対話できるからです。
この意味で、aNetworkStream
はアダプター設計パターンを使用します。Socket
API を APIに適合させて、Stream
期待しているクライアントStream
が使用できるようにします。
最後に、質問NetworkStream
です。 のStream
アダプターがある場合Socket
、どちらを使用する必要がありますか? が必要な場合は、Stream
それNetworkStream
が唯一の選択肢です。が必要ない場合はStream
、最も使い慣れた API を使用できます。すでにSocket
正常に使用している場合は、差し迫った理由で に切り替える必要はありませんNetworkStream
。
NetworkStream
抽象化の場合と同様に、作成とそれを操作することを分離できる可能性がありStream
ます。そのため、トランスポートを変更したりStream
、テスト用のスタブを作成したりすることができます。
メソッド自体の問題として、NetworkStream.Write
内部には(状態チェックを除く)唯一の操作がある streamSocket.Send(buffer, offset, size, SocketFlags.None);
ため、ソケットで呼び出すのとほとんど同じです。