20

カスタム FTP ライブラリを使用する ac# アプリケーションがあります。現在、Socket.Send を使用してデータを送信していますが、ソケットで NetworkStream を開始し、代わりに NetworkStream.Write を使用する方がよいかどうか疑問に思っていました。

一方を他方よりも使用する利点はありますか?

4

2 に答える 2

28

の利点は、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アダプター設計パターンを使用します。SocketAPI を APIに適合させて、Stream期待しているクライアントStreamが使用できるようにします。

最後に、質問NetworkStreamです。 のStreamアダプターがある場合Socket、どちらを使用する必要がありますか? が必要な場合は、StreamそれNetworkStreamが唯一の選択肢です。が必要ない場合はStream、最も使い慣れた API を使用できます。すでにSocket正常に使用している場合は、差し迫った理由で に切り替える必要はありませんNetworkStream

于 2011-07-02T05:46:55.130 に答える
3

NetworkStream抽象化の場合と同様に、作成とそれを操作することを分離できる可能性がありStreamます。そのため、トランスポートを変更したりStream、テスト用のスタブを作成したりすることができます。

メソッド自体の問題として、NetworkStream.Write内部には(状態チェックを除く)唯一の操作がある streamSocket.Send(buffer, offset, size, SocketFlags.None);ため、ソケットで呼び出すのとほとんど同じです。

于 2011-07-02T05:41:28.073 に答える