我用了一个循环从缓冲区中读取从服务器端发送过来的已经序列化的数据,用到了MemoryStream对象
反序列化方法中采用了MemoryStream对象作为参数。但是总是时不时显示异常:在分析完成之前就遇到结尾流
代码如下:接收时的循环:
public void SyncSocketReceive()
        {
            int bytesRead=0;
            byte[] buffer = new byte[1024];
            MemoryStream ms = new MemoryStream();
            do
            {
                bytesRead=syncsocket.Receive(buffer);
                ms.Write(buffer, 0, bytesRead);
                //offset += bytesRead;
            }
            while (bytesRead==1024);
            ms.Seek(0, SeekOrigin.Begin);//置零
            dsclient = DeserializeDate.Deserialize(ms);
            
        }
反序列化的函数:
         public static DataSet Deserialize(MemoryStream ms)
        {
            MemoryStream ms = new MemoryStream();
          //ms.Write(Recbtyes, 0, Recbtyes.Length);
          ms.Seek(0, SeekOrigin.Begin);//再次置零
          
          //MessageBox.Show(ms.Length.ToString());
          IFormatter bf = new BinaryFormatter();
          object obj = bf.Deserialize(ms); //总在这里有问题,时好时坏
          DataSet dsResult = (DataSet)obj; 
          ms.Close();
          return dsResult;
        }
 
断点调试过,置零都有有效的,但是一到object obj = bf.Deserialize(ms) ms的Position属性的值就变成最大值了
有谁知道怎么解决么?

解决方案 »

  1.   


                do 
                { 
                    bytesRead=syncsocket.Receive(buffer); 
                    ms.Write(buffer, 0, bytesRead); 
                    //offset += bytesRead; 
                } 
                while (bytesRead==1024); //这里,你不能规定它每次必须读到1024个字节
                                              //网络数据的传送不能想当然
                                              //改成while(bytesRead>0)
      

  2.   


    对, 并且如果服务器没有发送数据, 而客户端认为有数据 Read 会阻塞在那里
      

  3.   

    原理懂了,谢谢dancingbit(芥子) 但是最后会卡在那里啊,读完最后一部分以后,还要再读一遍,这时候就阻塞了
    小弟愚钝,有谁能贴的代码吗
      

  4.   

    两头需要约定一个结束定界符如果是文本的, 可以采用面向行的方式, 结束用 .<CR><LF> 表示, 或者空行表示如果是二进制流, 提前告知客户端数据大小.
      

  5.   


    to Dobzhansky(Stones)
    我就是不大清楚这个。
      

  6.   

    注意Socket的Receive方法,并不保证每次都正好接收缓冲区长度的字节,也就是说用bytesRead==1024来判断是否接收完毕是不对的,用bytesRead<=0来判断。
      

  7.   

    可以使用NetworkStream的Read方法来读,这个方法不会阻塞,如果超过一定时间后仍无新数据到达,可以判断为数据接收完成。
      

  8.   

    最后一次接收的数据没有调用ms.Write(buffer, 0, bytesRead);
    当bytesRead不为0的时候,接收的时候就是不完整的,所以会产生"在分析完成之前就遇到结尾流"的异常
      

  9.   

    Receive函数返回-1才能说明已结束
    另外while (bytesRead==1024);这个条件作为循环结束条件,必须满足网络通畅的条件,并且服务器端的数据是一次Send过来的,或者在完成之前每次都Send 1024的倍数字节.