两台主机相互通信  主机A把数据库返回的DATASET数据集序列化后  计算序列化后BYTE数组的长度 再序列化形成第二个长度为59的BYTE数组 把两个数组合并后通过NetworkStream.Write向主机B发送 主机B先读取前59个BYTE 然后反序列化后获得后续的真正数据BYTE数组长度 从而以此建立固定长度的个缓冲区来接受
byte[] k1 = new byte[59];
byte[] k2 ;
第一次读取  myNetwoekStream.Read(k1,0,59);            int length =(反序列化)k1;
            k2 = new byte[length + 59];
第二次读取  myNetworkStream.Read(k2,0,59 + length);
            最后通过FOR循环获得K2中第59位到最后一位的子数组,最终再反序   
            列化得到DATASET但是当我设置断点后发现  前后两次读取数据流后数组 K1和 K2的前59个元素竟然不同  但应该是一样的啊   求教高手第一次发贴,可能问题表达的不是很明白:) , 对问题有疑问的可以提问  

解决方案 »

  1.   

    我当时计算长度是为了 能够让接受端知道  后面真正的数据有多长 然后在接受端生成个合适的缓冲区数组来接受。因为如果不告诉接受端我将要发送多少数据的话  接受端不知道要建立个多大的缓冲区来接受整个数据 。呵呵 
    不过  我想 如果在发端将DATASET序列化后 分段发送 例如 长度11000个BYTE数组 每次发4000
     发三次  最后一次发送3000BYTE  另补零 凑满4000  然后收端收三次合成  但不知道补零 对于最后反序列化 还原DATASET有没有影响?
      

  2.   

    我一般把缓冲设为1024*800,不管传多少数据,即使是1K,也用这么大来接收,然后这样
    int i = socket.receive();
    再用Array.Copy( BufferData , 0 , ReceiveData , start , end );来把数据存到receiveData中,最后反序列化
      

  3.   

    >> myNetworkStream.Read(k2,0,59 + length);NetworkStream(或者任何一个其它的Stram)的Read操作是连续的。也就是说,如果头一次Read读取了59个字节,第二次是从Stream的第60个字节开始读的,不是第一个。如果Stream支持Random Access的话(比如MemoryStream),可以通过设置Position改变当前Read的位置,不过NetworkStram是forward only的,只能顺序读一次。
      

  4.   

    哦~~~好办法啊  谢谢
    但是 我又有个问题  
    现在如果仅仅说客户端发个SQL命令给服务器端  然后服务器端回个DATASET回来  是可实现的
    但是如果客户端要更新服务器的数据库呢
    比如
    1)客户端要告诉服务器端要更新哪张表  列如 传个TABLENAME给服务器端
    2)客户端要传个新的DATASET给服务器端  
    那么 在服务器端它通过什么机制来区分两者呢  如 服务器端应该先读取TABLENAME  判断更新哪张表然后再反序列化  还原DATASET 来更新?我不知道应该怎么做?
      

  5.   

    回 qqchen79(知秋一叶)
    那么就是说当我读取了59个字节后 再执行myNetworkStream.Read(k2,0,length);
    其实就是从第59个字节开始 向后读取length个字节到数组 K2中去了?但是我后来编译了一下  发现 不能对K2进行反序列化编译 还原DATASET  
    在反序列化时报错 〈〈二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改〉〉我是把序列化和反序列化代码写到DLL中  然后服务器和客户端都调用这个DLL  不存在对象版本更改的问题吧??  那么--- 二进制流“0”不包含有效的 BinaryHeader---又表示什么意思呢?
      

  6.   

    为了分析  -- 二进制流“0”不包含有效的 BinaryHeader ,  我在客户端进行了次反编译 没问题  
    但是当进行传输后 在接受端发现长度为76434个BYTE数组 中从第37887个BYTE开始 全为零了 ,
    于是我在客户端的程序设了个断点 ,检查发送前的数组,发现将DATASET反序列化后得到的BYTE数组从37887位开始为零  但是到第68590开始又开始有非零数值
    难道接受数据流的时候  当出现连续多个零的时候 会默认数据流结束?
     如果是这样的话  怎么解决呢??
    请教高手啊~~~~