我有一个使用自定义 FTP 库的 ac# 应用程序。现在我使用 Socket.Send 发送数据,但我想知道用套接字启动 NetworkStream 并改用 NetworkStream.Write 是否会更好。
使用其中一个有什么优势吗?
我有一个使用自定义 FTP 库的 ac# 应用程序。现在我使用 Socket.Send 发送数据,但我想知道用套接字启动 NetworkStream 并改用 NetworkStream.Write 是否会更好。
使用其中一个有什么优势吗?
a 的优势NetworkStream
主要源于它是 a 的事实Stream
。a 的缺点Socket
是从抽象 I/O 源(如 a)读取和写入的通用代码Stream
无法处理 a Socket
。
a 的主要用例NetworkStream
是您在其他地方有一些从 a 读取或写入的代码Stream
,并且您希望可以将它与 a 一起使用Socket
。您会知道是否处于这种情况,然后NetworkStream
会有很大的帮助!
例如,假设您有一个通信库,并且您支持从文件、命名管道和 TCP/IP 序列化消息。I/O 类的理想选择是Stream
. 然后您的序列化方法可以接受 a FileStream
、 aPipeStream
或 a NetworkStream
。它甚至会接受一个MemoryStream
. 这是抽象的好处,因为在我们创建了流之后,一个方法可以与它进行交互,而无需知道它是什么类型的流。
从这个意义上说,aNetworkStream
使用了适配器设计模式。它使Socket
API适应 API,Stream
以便期望 a 的客户端Stream
可以使用它。
所以最后的问题是,如果NetworkStream
是 a 的Stream
适配器Socket
,我们应该使用哪一个?好吧,如果您需要,Stream
那么NetworkStream
是您唯一的选择。如果您不需要Stream
,那么您可以使用您最熟悉的任何 API。如果您已经Socket
成功使用,则没有迫切的理由切换到NetworkStream
.
您可以NetworkStream
像使用抽象一样单独创建和使用它Stream
- 因此您将能够更改传输或简单地创建Stream
存根以进行测试。
作为方法本身的问题 -NetworkStream.Write
内部有唯一的操作(状态检查除外) streamSocket.Send(buffer, offset, size, SocketFlags.None);
- 所以它与在套接字上调用它几乎相同。