直接在 Socket 上使用 TcpClient 有啥好处?

Posted

技术标签:

【中文标题】直接在 Socket 上使用 TcpClient 有啥好处?【英文标题】:What are the benefits of using TcpClient over a Socket directly?直接在 Socket 上使用 TcpClient 有什么好处? 【发布时间】:2012-03-22 02:44:39 【问题描述】:

我知道 TcpClient 是套接字类的包装器,如果使用 TcpClient,我可以访问底层套接字,但包装器到底是做什么的?

当使用 TCPClient 时,我是否需要像使用套接字一样继续调用 Receive(),或者包装器是否确保我的所有数据都出现?

最后,我可以在服务器和客户端都使用TcpClient来包装socket吗(在使用TcpListener接受服务器上的原始连接之后)

【问题讨论】:

【参考方案1】:

包装器究竟做了什么?

让我用一个例子来解释一下。您在 C#File.ReadAllLines 中有一个方法。它会为您读取文件中的所有行。现在,您还可以通过FileStream 类或任何其他读取文件的类 .. BUT.. 包装器(即File.ReadAllLines)实现相同的结果,允许您用更少的代码行来实现相同的结果。包装器总是通过抽象出低级细节来提高生产力

使用 TCPClient 时,我是否需要像我一样继续调用 Receive() 使用套接字还是包装器确保我的所有数据都出现?

TCPClient 没有像Socket 这样的Receive 方法,但想法是一样的。您将不得不使用GetStream 之类的方法来读取它不会自动为您显示的数据

我可以在服务器和客户端上都使用 TcpClient 来包装 插座

是的,您可以在客户端和服务器端安全地使用它

【讨论】:

啊,我明白了。所以我是否正确地说,相当于执行 BeginReceive(),然后是 EndReceive(),存储字节并再次调用 BeginReceive() 直到在套接字上接收到消息,可以使用 来执行TcpClient 上的 myTcpClient.GetStream().BeginRead()? BeginRead() 会不会调用 EndRead() 回调,直到确实收到了指定的字节数? (无需不断调用 BeginRead()/BeginReceive() 直到收到所有预期的字节) 我更喜欢使用 NetworkStream 类的 ReadWrite 方法,而不是 BeginReadEndRead,因为您不必显式调用 BeginRead 和 @987654335 @包装器会为你做。在互联网上查看一些示例,例如 msdn.microsoft.com/en-us/library/… 感谢您为我澄清这一点。

以上是关于直接在 Socket 上使用 TcpClient 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

tcpclient和socket的区别?

网络编程中,使用Socket和TcpClient有啥区别

Socket入门笔记 用TcpClient实现一个简易聊天室

esp32tcpclient最大传输的数据长度

TCP调试助手与TCPSocket区别

tcpclient和socket的区别