现在做一个Tcpclient接收数据,但是不完整,用了clientStream.CanRead && clientStream.DataAvailable这些属性,都不能完整接收,下面是我的接收代码
try
{
int timeout = 45000; //ms
Stopwatch sw = new Stopwatch();
StringBuilder completeMessage = new System.Text.StringBuilder();
sw.Start();
lock (lockObject)
{
if (clientStream.CanRead && clientStream.DataAvailable)
{
byte[] readBuffer = new byte[bufferSize];
int numberOfBytesRead = 0;
// Fill byte array with data from ARCL stream
numberOfBytesRead = clientStream.Read(readBuffer, 0, readBuffer.Length);
// Convert the number of bytes received to a string and
// concatenate to complete message
completeMessage.AppendFormat("{0}", System.Text.Encoding.ASCII.GetString(readBuffer, 0, numberOfBytesRead));
sw.Stop();
if (sw.ElapsedMilliseconds >= timeout)
throw new TimeoutException();
}
}
return completeMessage.ToString();
}
catch (TimeoutException ex)
{
return null;
}
你这些属性只是保证流是否关闭 具体读完与否 最好与客户端做个数据的约定
比较常见的思路 如 数据包头几个字节为长度域 让客户端上送时 前面加上这几个字节
服务端先接受长度域后 可以对后面数据做校验
推荐使用异步接收,只要你两个数据包之间有一定的间隔时间,一般可以接收完整的数据包,前提是你的数据包也不大。
也可以自定义结束码,判断是否收到结束码判断结束
完整性,不代表接收完。
3楼办法可以!有个小小的短板就是,当单个包体太大的话,得拿到整个buffer才能解析处理。
还有一种方案,用xml,动态解析器。比如expat,即使xml不完整,也能解析。