【问题标题】: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接受服务器上的原始连接之后)

【问题讨论】:

    标签: c# sockets tcpclient


    【解决方案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/…
    • 感谢您为我澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2016-11-18
    • 2023-02-20
    • 2021-02-23
    • 2015-09-09
    • 2010-12-22
    • 2012-07-17
    相关资源
    最近更新 更多