我一直认为TcpClient可以简化我的网络应用程序中的套接字操作。从数据读取TcpClient劣于套接字
但是,似乎TcpClient需要知道应该从底层套接字读取多少数据。它看起来像TcpClient.GetStream(..)。Read(..)调用Socket.Receive(..)它读取指定的字节数。
TcpClient暴露NetworkStream,这可能是相当烦人的处理。类似于终止字符串的东西以及不可靠的DataAvailable属性使读取未知TCP“数据包”变得复杂。
使用Socket.ReceiveFrom(..)似乎更“面向数据包”。
我通常使用TcpClient的绑定和握手等等,而对阅读中,我使用
Socket socket = _tcpClient.Client;
byte[] buffer = new byte[1000];
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint senderRemote = sender;
int length = socket.ReceiveFrom(buffer, ref senderRemote);
string replyString = Encoding.ASCII.GetString(buffer, 0, length);
return replyString;
一些开销与缓冲区初始化,但它打败离的NetworkStream一次读取一个字节,并寻找终止字符或字符串。
TcpClient不能以更好的方式处理读取数据,例如Socket的方式,这难道不奇怪吗?