直接在 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
类的 Read
和 Write
方法,而不是 BeginRead
和 EndRead
,因为您不必显式调用 BeginRead
和 @987654335 @包装器会为你做。在互联网上查看一些示例,例如 msdn.microsoft.com/en-us/library/…
感谢您为我澄清这一点。以上是关于直接在 Socket 上使用 TcpClient 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章