我一直认为 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;
缓冲区初始化有一些开销,但它胜过从网络流中一次读取一个字节,并寻找终止字符或字符串。
TcpClient 没有以更好的方式处理读取数据,即 Socket 的方式,是不是有点奇怪?