[英]NetworkStream.Write data seems not to arrive at receiving socket
[英]NetworkStream.Write vs. Socket.Send
我有一个 c# 应用程序,我使用自定义 FTP 库。 现在我使用 Socket.Send 发送数据,但我想知道用套接字启动 NetworkStream 并改用 NetworkStream.Write 是否会更好。
使用其中一个有什么优势吗?
NetworkStream
的优势主要源于它是Stream
。 Socket
的缺点是从抽象 I/O 源(如Stream
)读取和写入的通用代码无法处理Socket
。
NetworkStream
的主要用例是您在其他地方有一些从Stream
读取或写入的代码,并且您希望可以将它与Socket
一起使用。 您会知道是否处于这种情况,然后NetworkStream
将有很大帮助!
例如,假设您有一个通信库,并且您支持从文件、命名管道和 TCP/IP 序列化消息。 I/O class 的理想选择是Stream
。 然后您的序列化方法可以接受FileStream
、 PipeStream
或NetworkStream
。 它甚至会接受MemoryStream
。 这是抽象的好处,因为在我们创建了 stream 之后,一个方法可以与它交互,而无需知道它是哪种 stream。
从这个意义上说, NetworkStream
使用适配器设计模式。 它将Socket
API 适配到Stream
API 以便期望Stream
的客户可以使用它。
所以最后的问题是,如果NetworkStream
是Socket
的Stream
适配器,我们应该使用哪一个? 好吧,如果您需要Stream
,那么NetworkStream
是您唯一的选择。 如果您不需要Stream
,那么您可以使用您最熟悉的 API 。 如果您已经成功使用了Socket
,则没有迫切的理由切换到NetworkStream
。
您可以单独创建NetworkStream
并像使用抽象Stream
一样使用它 - 这样您就可以更改传输或简单地创建Stream
存根进行测试。
作为方法本身的问题 - NetworkStream.Write
里面有唯一的操作(除了 state 检查) streamSocket.Send(buffer, offset, size, SocketFlags.None);
- 所以它与在套接字上调用它几乎相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.