C#中的TCPClient和Socket有什么区别?

68

我并没有看到太多使用 TCPClient 的场景,但是却有很多使用 Socket 的情况。它们之间的主要区别是什么呢?在什么情况下应该使用它们?

我了解到 .NET 中的 Socket 类是建立在 WINSOCK 之上的,而 TCPClient 则是对于 Socket 类的包装器。因此,TCPClient 处于整个链路的更高层次,可能会比较低效。如果我说错了,请纠正我。

2个回答

58
使用TcpClient和TcpListener只是意味着少写几行代码。正如您所说,它只是Socket类的一个包装器,因此它们之间没有性能差异,这纯粹是样式选择。
更新:自发布此答案以来,.Net源代码已经可用。它确实显示TcpClientSocket类的一个非常轻量级的包装器,它本身是在本地WinSock2 API*之上的一个包装器。
  • 在Windows上。对于其他平台上的.Net Standard/Core等将有所不同。

2
“风格”在这里是指“常识”。如果可以使用预制件,尽管使用吧 :) - xtofl
7
这里的注释似乎与此相矛盾。http://msdn.microsoft.com/en-us/library/system.net.sockets.socket%28v=vs.110%29.aspx "如果您正在编写相对简单的应用程序,并且不需要最大的性能,请考虑使用TcpClient" - Jon
4
没有矛盾。关于更高层次抽象的普遍假设是,它在底层功能方面的灵活性较低。因此,如果您需要做一些不符合“TcpClient”模型的事情,您可能会扭曲和弯曲其API,并在此过程中失去可读性和性能。然而,如果您使用它来完成设计目的,则没有固有理由认为它的性能不如更明确的API差,但您将从可读性中获得收益。 - tne

18

此外,你可以直接从TCPClient对象中访问套接字,它在属性Client下面 - 因此没有性能差异。


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