您的位置:程序门 -> .net技术 -> c#



请教关于 networkstream 两次读取相同数据流出错的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教关于 networkstream 两次读取相同数据流出错的问题[已结贴,结贴人:bobby_198306]
发表于:2007-02-16 17:14:42 楼主
两台主机相互通信     主机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个元素竟然不同     但应该是一样的啊       求教高手

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

发表于:2007-02-16 19:49:181楼 得分:0
我不知道你为什么这么做,不过接收时最好不要把接收的缓冲设得和发送数据一样大,因为发过时还有一些校验数据等,最好把接收缓冲设得大一点,反序列化时,直接反序列化即可,不能再算接收的多少了,你先试试。
发表于:2007-02-16 21:30:042楼 得分:0
我当时计算长度是为了   能够让接受端知道     后面真正的数据有多长   然后在接受端生成个合适的缓冲区数组来接受。因为如果不告诉接受端我将要发送多少数据的话     接受端不知道要建立个多大的缓冲区来接受整个数据   。呵呵  
不过     我想   如果在发端将dataset序列化后   分段发送   例如   长度11000个byte数组   每次发4000
  发三次     最后一次发送3000byte     另补零   凑满4000     然后收端收三次合成     但不知道补零   对于最后反序列化   还原dataset有没有影响?
发表于:2007-02-16 21:47:003楼 得分:10
我一般把缓冲设为1024*800,不管传多少数据,即使是1k,也用这么大来接收,然后这样
int   i   =   socket.receive();
再用array.copy(   bufferdata   ,   0   ,   receivedata   ,   start   ,   end   );来把数据存到receivedata中,最后反序列化
发表于:2007-02-16 21:47:584楼 得分:0
你可能把事情想复杂了。
发表于:2007-02-16 22:31:235楼 得分:10
> >   mynetworkstream.read(k2,0,59   +   length);

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

如果stream支持random   access的话(比如memorystream),可以通过设置position改变当前read的位置,不过networkstram是forward   only的,只能顺序读一次。
发表于:2007-02-16 22:35:526楼 得分:0
哦~~~好办法啊     谢谢
但是   我又有个问题    
现在如果仅仅说客户端发个sql命令给服务器端     然后服务器端回个dataset回来     是可实现的
但是如果客户端要更新服务器的数据库呢
比如
1)客户端要告诉服务器端要更新哪张表     列如   传个tablename给服务器端
2)客户端要传个新的dataset给服务器端    
那么   在服务器端它通过什么机制来区分两者呢     如   服务器端应该先读取tablename     判断更新哪张表然后再反序列化     还原dataset   来更新?我不知道应该怎么做?
发表于:2007-02-16 22:50:297楼 得分:0
回   qqchen79(知秋一叶)
那么就是说当我读取了59个字节后   再执行mynetworkstream.read(k2,0,length);
其实就是从第59个字节开始   向后读取length个字节到数组   k2中去了?

但是我后来编译了一下     发现   不能对k2进行反序列化编译   还原dataset    
在反序列化时报错  

〈〈二进制流“0”不包含有效的   binaryheader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改〉〉

我是把序列化和反序列化代码写到dll中     然后服务器和客户端都调用这个dll     不存在对象版本更改的问题吧??     那么---   二进制流“0”不包含有效的   binaryheader---又表示什么意思呢?
发表于:2007-02-16 23:06:288楼 得分:0
为了分析     --   二进制流“0”不包含有效的   binaryheader   ,     我在客户端进行了次反编译   没问题    
但是当进行传输后   在接受端发现长度为76434个byte数组   中从第37887个byte开始   全为零了   ,
于是我在客户端的程序设了个断点   ,检查发送前的数组,发现将dataset反序列化后得到的byte数组从37887位开始为零     但是到第68590开始又开始有非零数值
难道接受数据流的时候     当出现连续多个零的时候   会默认数据流结束?
  如果是这样的话     怎么解决呢??
请教高手啊~~~~
发表于:2007-02-17 05:23:479楼 得分:0
up


快速检索

最新资讯
热门点击