NetworkStream和Socket类有什么区别?

5
我有一个项目,可能需要抽象出客户端和服务器之间的通信。一开始我使用套接字和TCP协议,后来想切换到进程间通信管道。我看了看System.IO.PipedStream类,发现PipeStream和Socket类有很多重叠之处。但是当我查看Socket类时,它继承自Object,因此Socket和PipeStreams之间没有公共接口或抽象类。
我想起了NetworkStream的一些东西。它显然包装了Socket类。但至少NetworkStream和PipeStream都继承自Stream,这意味着我可以交换我的实现。我想是这样,但我还没有尝试过。一直以来我一直在使用套接字。
我的问题是:使用NetworkStream类是否有任何不利之处?有什么需要注意的地方吗?

对于高级通信,使用WFC比原始TCP或管道更好。 - The Smallest
你说的“可能很好”是什么意思?请记住,TCP/IP套接字是一种完全有效的进程间通信形式。 - Stephen Cleary
@Stephen。我想象它比涉及TCP/IP协议栈更快。 - uriDium
2个回答

2
如果你被迫使用低级选项,如套接字和管道,并且希望有一个抽象层来从这些数据源中提取流数据,则Stream类是完美的选择,因为它为该模型提供了抽象层。
如果你编写针对Stream实例的代码,则可以使任何东西实现Stream,而不必担心底层传输。
关于使用NetworkStream与Socket,NetworkStream只是封装了Socket实例并将调用应用到Socket的拉模型(Stream)。

@ casperOne:感谢您的回答。您能详细解释一下“pull model”的含义吗? - uriDium
@uriDium:更新答案以区分拉取和推送模型。 - casperOne
1
额,你在说什么?拉取和推送与事物有什么关系? - jgauffin
@jgauffin:我刚意识到我混淆了命名管道流和SerialPort类(我不知道为什么),它使用推送模型而不是拉取模型。我已更新答案,删除区别并保持更加准确。 - casperOne
@casperOne:模型如下。我们需要一个线程不断向流中发送数据并接收确认信息。然后另一个线程不断接收和发送确认信息。套接字非常完美。但现在我们遇到了客户端和服务器在同一台机器上的情况。我认为如果它们使用命名管道而不是套接字,可能会更快。 - uriDium
1
@uriDium:基本上这是一个双工通道,双方都可以随时相互发送消息。你现在应该真的考虑使用WPF,因为它支持这种消息传递模式,同时还可以使用TCP(基于套接字)和命名管道传输通道。 - casperOne

1

由于您不知道从Socket切换到NetworkStream时可能存在的任何缺点,因此您很可能不需要直接使用Socket。Socket可以给您更多的控制权,但由于您不知道这些缺点,您很可能不需要那种控制。

请记住,仅仅因为您切换到了NetworkStream并不意味着事情变得可靠或快速。(当您开始在不同的流实现之间切换时,这可能很容易被忽略)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接