使用NetworkStream收取数据不全问题讨论,列举目前方式,求最佳解决方式

TcpClient tcpClient = new TcpClient();

// 获取流进行读写
//写入预置信息
NetworkStream streamServer = tcpClient.GetStream();
streamServer.Write(PackageContent, 0, PackageContent.Length);

//读取返回数据
……

 

读取返回数据采取以下两种方式,都存在收取不全问题
方式一:

while ((i = streamServer.Read(bytes, 0, bytes.Length)) != 0)
{
for (int j = 0; j < i; j++)
{
list.Add(bytes[j]);
}
}

 

方式二:

do
{
i = streamServer.Read(bytes, 0, bytes.Length);
for (int j = 0; j < i; j++)
{
list.Add(bytes[j]);
}

}
while (streamServer.DataAvailable);

 

以上两种方式理想状态下正常,在客户端和服务器端在单台机器或者局域网部署问题不明显,一般能收全,但是在互联网环境下,比如测试csdn的登陆页面,jquery.js就收不全(自身文件也比较大),原理在于理论上NetworkStream.Read会堵塞进行读,但实际管道为空的时候(出现管道为空的原因推测为网络延迟,服务器端有段时间未返回数据),读出来的数据字节长度为0或者DataAvailable属性为false,导致尚未读取完整就退出了循环。


采用以下方式能一定程度上降低这种影响

streamServer.ReadTimeout = 500; 
do
{
try
{
i = streamServer.Read(bytes, 0, bytes.Length);
for (int j = 0; j < i; j++)
{
list.Add(bytes[j]);
}
}
catch
{

i = 0;
}

}
while (i>0);

 

即给NetworkSteam设置一个读取超时时间,若超时,则认为服务器端已写完,无数据返回,将该值设为100还是读不全csdn登陆页面,设为500就正常了


这种解决方式并不好,会导致服务响应时间变长,求更佳解决方式,此问题为常见问题,欢迎大家讨论,高手赐教。

posted on 2012-02-17 09:17  大浪淘沙  阅读(1472)  评论(1编辑  收藏  举报

导航