日期:2014-05-20  浏览次数:20948 次

请教关于 NetworkStream 两次读取相同数据流出错的问题
两台主机相互通信     主机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个元素竟然不同     但应该是一样的啊       求教高手

第一次发贴,可能问题表达的不是很明白:)   ,   对问题有疑问的可以提问    



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

NetworkStream(或者任何一个其它的Stram)的Read操作是连续的。也就是说,如果头一次Read读取了59个字节,第二次是从Stream的第60个字节开始读的,不是第一个。

如果Stream支持Random Access的话(比如MemoryStream),可以通过设置Position改变当前Read的位置,不过NetworkStram是forward only的,只能顺序读一次。