从数据读取TcpClient不如socket

时间:2012-06-25 10:51:20

标签: c# .net

我一直认为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 个答案:

答案 0 :(得分:1)

有些协议具有固定大小的标头,其中包含有效负载的大小,因此可能不是奇怪的。

在你的情况下,你可能最好直接使用Socket,或者你可以在NetworkStream周围写一个包装器来读取缓冲区并允许你Peek()进入终止字符。