zoukankan      html  css  js  c++  java
  • 使用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就正常了


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

  • 相关阅读:
    eclipse修改web项目部署路径
    Jquery面试题
    23中设计模式之单例模式
    详细探讨单例模式
    java常用设计模式
    vue官网总结
    pytorch模型训练加速tricks
    element table显示滚动条
    vue中less文件全局引用
    vue路径别名无法识别,Cannot find module
  • 原文地址:https://www.cnblogs.com/seawaving/p/2355241.html
Copyright © 2011-2022 走看看