判断一下stream.DataAvailable ,检查数据是否可读。

解决方案 »

  1.   

    断点查看发现,stream.DataAvailable的值为false,是什么原因导致这个情况的发生呢?
      

  2.   

    断点查看发现,stream.DataAvailable的值为false,是什么原因导致这个情况的发生呢?
      

  3.   

    NetworkStream.CanRead 属性,指示 NetworkStream 是否支持读取。 
    NetworkStream.DataAvailable 属性,指示在要读取的 NetworkStream 上是否有可用的数据。 
    使用 DataAvailable 属性确定是否可以读取数据。如果 DataAvailable 为 true,则对 Read 的调用将立即返回。如果远程主机处于关机状态或关闭了连接,DataAvailable 可能会引发 SocketException。
      

  4.   

    我断点跟踪的时候发现:client.Active的值为 true
    stream.DataAvailable 的值为false请问,是什么原因导致这个情况的发生呢?应该如何解决?谢谢
      

  5.   

    搂主把这里:byte[] bytes = new byte[client.ReceiveBufferSize]; 
    改成:byte[] bytes = new byte[stream.Length];
    看看呢
      

  6.   

    我感觉是因为搂主byte[] bytes = new byte[client.ReceiveBufferSize]; 这样定义的字节长度并不一定等于NetworkStream 的长度,所以上面我建议改成stream.Length,但没想到她不支持那么,搂主一个字节一个字节的读取比较好:
    byte[] bytes = new byte[8];
    int pos = 0;
    while (stream.ReadByte() != -1)
    {
         pos++;
         if(bytes.Length < pos)
         {
             byte[] newBytes = new byte[pos+1];
             Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
             bytes = newBytes;
         }
         stream.Read(bytes, pos, 1);
    }这样读应该可以了,不过我是直接在这里敲的代码,难免有错误,搂住自己测测吧
      

  7.   

    7L正解,可以加上超时.规定时间DataAvailable 一直为false,就可以判断超时,或者定义receivetimeout属性.
    判断IOException为超时
      

  8.   


    网络流不支持查找和length
      

  9.   

    调试发现新问题,本来stream.DataAvailable为true,但是如果运行这句之后:int bytesRead = stream.Read(bytes, 0, (int) client.ReceiveBufferSize);stream.DataAvailable为false如果删除此行,stream.DataAvailable的值就一直为true,请问这是怎么回事??希望大家能看看,谢谢。
      

  10.   

    前面已经说了哟,NetworkStream不支持查找的,所以也就不支持重复读的,因为当你读过之后,指针自然就移动到流结尾的位置处了,然后DataAvailable肯定会自动变成false的
    搂主的client.ReceiveBufferSize的值肯定不等于流的长度,所以会出现错误,所以建议搂主使用11楼的代码,不过测试了一下,代码有个错误,改正一下:byte[] bytes = new byte[8];
    int pos = 0;
    while (stream.ReadByte() != -1)
    {
         pos++;
         if(bytes.Length <= pos)
         {
             byte[] newBytes = new byte[pos+1];
             Array.Copy(bytes, 0, newBytes, 0, bytes.Length);
             bytes = newBytes;
         }
         stream.Read(bytes, pos, 1);
    }然后就可以使用这个bytes变量了。
      

  11.   

    byte[] bytes = new byte[8]; 这个地方有点不明白,为什么是 new byte[8],万一小了怎么办?
      

  12.   

    嗯,小了会自动重新分配内存的,上面代码中数组的动态分配过程和ArrayList对象是一致的,搂主放心好了
      

  13.   

    byte[] bytes = new byte[8]; 
    int pos = 0; 
    while (stream.ReadByte() != -1) 

        pos++; 
        if(bytes.Length <= pos) 
        { 
            byte[] newBytes = new byte[pos+1]; 
            Array.Copy(bytes, 0, newBytes, 0, bytes.Length); 
            bytes = newBytes; 
        } 
        stream.Read(bytes, pos, 1); 
    } 用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
      

  14.   

    byte[] bytes = new byte[8]; 
    int pos = 0; 
    while (stream.ReadByte() != -1) 

        pos++; 
        if(bytes.Length <= pos) 
        { 
            byte[] newBytes = new byte[pos+1]; 
            Array.Copy(bytes, 0, newBytes, 0, bytes.Length); 
            bytes = newBytes; 
        } 
        stream.Read(bytes, pos, 1); 
    } 用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
      

  15.   

    byte[] bytes = new byte[8]; 
    int pos = 0; 
    while (stream.ReadByte() != -1) 

        pos++; 
        if(bytes.Length <= pos) 
        { 
            byte[] newBytes = new byte[pos+1]; 
            Array.Copy(bytes, 0, newBytes, 0, bytes.Length); 
            bytes = newBytes; 
        } 
        stream.Read(bytes, pos, 1); 
    } 用了这个代码当 pos=217时,则弹出错误提示:“无法从传输连接中读取数据”,这是怎么一回事呢?麻烦请看看
      

  16.   

    这就要看搂主的数据发送是什么样的一个过程了
    我这里使用HttpWebRequest和HttpWebResponse测试是可以的,能够把网页内容给Down下来。
      

  17.   

    哇,怎么发了那么多遍啊??看来网速不好就是不行啊。是这样的,我这里是一个C/S结构的程序,用TCPClient进行通讯,所以要用到NetworkStream做为客户端与服务器端之间的交流信息,然后在读写NetworkStream的时候就出现了以上所描述的问题。
      

  18.   

    楼主解决了么?小弟也遇到此类 问题,麻烦指点下 谢谢。[email protected]
      

  19.   

    服务器端没有接收到数据或者没有针对此数据进行应答。
    出现此问题的原因很多,不过我的判断基本上就是服务器没接收到数据或者是服务器没有应答,之所以这么说,因为我以前的程序出现这个原因的时候,我调试发现,大多数情况是server并没接收到数据。个人分析,产生此问题的原因如下:
    对于短连接:同步接收,client的发送频繁,而服务器接收有个等待时间,当sleep期间,数据错过。异步回调,由于发送频繁,没反应过来。
    对于长连接:同步同样有此情况。对于异步,应该不存在此种情况。故综合分析,如果想避免此种情况发生,对于同步,主要是接收时的休眠时间问题;对于异步,好像不适合做短连接。
    那修改时,按照此要点修改即可解决问题。