NetworkStream和Socket类有什么区别?

时间:2010-12-01 13:50:42

标签: .net sockets network-programming

我有一个项目,我可能想要抽象客户端和服务器之间的通信。我最初使用套接字和TCP。然后我认为能够切换到进程间通信通道可能会很好。然后我查看了System.IO.PipedStream类,发现PipeStream和Socket类之间有很多重叠。但是当我查看Socket类时,它继承自Object。因此,Socket和PipeStream之间没有通用接口或抽象类。

然后我记得有关NetworkStream的一些事情。它显然包装了一个Socket类。但至少NetworkStream和PipeStream都继承自Stream。这意味着我可以交换我的实现。我想,我还没试过。我一直在使用套接字。

所以我的问题是:在Socket类上使用NetworkStream类有什么不利之处。任何陷阱或任何需要注意的事项?

2 个答案:

答案 0 :(得分:1)

如果您被迫使用诸如套接字和管道之类的低级选项,并且您想要从这些数据源中提取流数据的抽象,那么Stream类是完美的,因为它提供了该模型的抽象

如果您针对Stream实例进行编码,那么您可以执行任何实现Stream的操作,而不必担心底层传输。

在使用NetworkStream vs Socket时,NetworkStream只包装一个Socket实例,并将对pull模型(Stream)的调用应用到Socket。

答案 1 :(得分:1)

由于从Socket切换到NetworkStream时您不知道任何缺点,因此您很可能不需要直接使用Socket。 Socket为您提供了更多控制权,但由于您没有意识到这些缺点,因此您很可能不需要这种控制。

请记住,事情不会变得可靠或快速,因为您正在切换到NetworkStream。 (当您开始在不同的流实现之间切换时,可能很容易忘记。)