如何正确使用写入固定大小缓冲区(此处为"TcpClient")的`Read()`方法?

Bru*_*oLM 2 c# connection tcplistener tcpclient

我正在尝试从a读取数据,以下TcpClient是我的工作方式:

var client = tcpListener.AcceptTcpClient();
var data = new byte[client.ReceiveBufferSize];

StringBuilder dataString = new StringBuilder();
using (var ns = client.GetStream())
{
    while (ns.Read(data, 0, client.ReceiveBufferSize) != 0)
    {
        dataString.Append(Encoding.UTF8.GetString(data));
    }
}
client.Close();
Run Code Online (Sandbox Code Playgroud)

问题是我的字符串长度不是8192(这是值client.ReceiveBufferSize),因此我\0在StringBuilder中附加了很多.

我怎样才能获得确切的数据量?

pho*_*oog 9

int readCount;
while ((readCount = ns.Read(data, 0, client.ReceiveBufferSize)) != 0)
{
    dataString.Append(Encoding.UTF8.GetString(data, 0, readCount));
}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如mg30rg在评论中指出的那样,这种方法容易受到连接然后立即断开连接的客户端的影响.最好DataAvailable在打电话前检查房产Read(); 否则线程会明显无限制地阻塞.

此外,该Connected属性将明显恢复true,直到Read()或者Write()被调用,所以你将不能够通过使用属性来检测这种情况.