我正在尝试从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();
问题是我的字符串的长度不是8192(这是client.ReceiveBufferSize
的值),因此我在StringBuilder中附加了很多\0
。
如何才能获得确切的数据量?
答案 0 :(得分:9)
int readCount;
while ((readCount = ns.Read(data, 0, client.ReceiveBufferSize)) != 0)
{
dataString.Append(Encoding.UTF8.GetString(data, 0, readCount));
}
编辑:
正如mg30rg在评论中指出的那样,这种方法容易受到连接然后立即断开连接的客户端的攻击。在调用DataAvailable
之前,最好先检查Read()
属性;否则线程显然会无限期地阻塞。
此外,Connected
属性显然会在调用true
或Read()
之前返回Write()
,因此您无法通过使用该属性来检测此情况