我一直认为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的做法,这有点奇怪吗?
1 回答
有些协议具有固定大小的标头,其中包含有效负载的大小,因此可能并不奇怪 .
在你的情况下你可能最好直接使用
Socket
,或者你可以在NetworkStream
周围写一个包装器,它读入缓冲区并允许你Peek()
进入终止字符 .