使用TcpClient相比直接使用Socket有哪些优点?

21

我知道TcpClient是socket类的包装器,用TcpClient可以访问底层的socket,但这个包装器具体有什么作用呢?

在使用TCPClient时,我是否需要像使用socket一样不断调用Receive()方法,或者说这个包装器会确保所有数据都被接收到了?

最后,我能否在服务器和客户端上同时使用TcpClient来包装socket(在服务器上使用TcpListener接受原始连接后)?

1个回答

22

包装器(wrapper)实际上是做什么的?

我举个例子来解释一下。在C#中有一个方法叫File.ReadAllLines,它可以帮你读取文件中的所有行。当然你也可以通过FileStream类或者其他读取文件的类来实现同样的效果……但是,使用包装器即File.ReadAllLines,可以让你用更少的代码实现同样的效果。包装器总是通过抽象出低层细节来提高生产率。

使用TCPClient时,我需要像使用Socket那样不断调用Receive()方法吗?还是包装器会确保我的所有数据都出现了?

TCPClient没有像Socket那样的Receive方法,但是想法是相同的。您需要使用GetStream等方法来读取数据,它不会自动出现在您面前。

我可以在服务器和客户端上都使用TcpClient来包装套接字吗?

是的,你可以放心地在客户端和服务器端都使用它。


我明白了。那么,我说使用TcpClient的myTcpClient.GetStream().BeginRead()来执行在套接字上执行_BeginReceive()、然后是EndReceive(),存储字节并再次调用BeginReceive()直到消息接收完成的等效操作,是正确的吗? BeginRead()是否会在确实接收到指定数量的字节之前不调用EndRead()回调?(无需不断调用BeginRead()/BeginReceive()直到接收到所有预期的字节) - Dermot
1
我更倾向于使用NetworkStream类的ReadWrite方法,而不是BeginReadEndRead,因为您不必显式地调用BeginReadEndRead,封装程序会自动处理。在互联网上查看一些示例,例如http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx。 - Haris Hasan

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