当我传输的数据量较小时,接收方能正确将数据完全接收;但是当我传输的数据量较大时,接收方所接受的数据就不完整了,有数据丢失现象,请问各位指点,该如何实现传输大量数据时,数据的完整性?
解决方案 »
- 用winsock发送信息的问题?
- 谁有quatrz.dll类型库,请发邮件:[email protected]
- 如何处理webbrowser的弹出登陆对话框,使之不弹出,而且完成自动登陆?高人请指点!!
- 我做了个试验,难道更新存在这个问题,为什么?我虽是新手,但该问题值得研究!!!
- 这样的备份是怎么个原理?
- 问一个简单问题
- 在线等!请教问题,VB+Access,读取数据库表数据后返回的Recordset没有更新。多谢了,提分等
- 求教:VB 里datagrid控件怎么显示查询结果?数据库是access
- 如何实现active dll的调用
- VB生成Excell报表的问题
- datagrid显示数据的简单问题
- 水晶报表里可以实现嵌套报表设计吗?
采用tcp协议,会自动找包
多谢!
如果数据超过8k就会出现丢包,这样只能通过拆包来处理,不会要我贴代码吧,网上到处都是
在大标题中的'拨号'还不够明白吗?
你没有使用Mscomm控件吗?
你可把每次收到的数据按包的大小依次写入文件,在发送方最后要给个结束标志,接收方一旦检测到结束标志就可以把整个文件做为数据处理了。
socket我常用,几百M 数据都传输过,每次能收到的包的大小也是不定的,从几十Byte到几Kbyte都有,要看网络状态,一般局域网包要大一些。
MsComm就没怎么用过,只知道它不会象Tcp协议那样为你分包传输,我觉得不应采用轮询方式接收大数据,应采用以事件驱动为主的应答方式,主动对数据分段,每次发送一段,接收方在OnComm事件中通过CommEvent检测接收数据,并及时采用Input属性接收数据和删除端口缓冲区,再请求发送下一段,如此往复才行。
楼上说的有理,在Mscomm的OnComm事件中我所采用的就是楼上所说的方式,但是在传输过程中,少量数据在接收时是没有问题的,一旦数据量大时就有数据丢失的现象,对此我是疑惑不解呀!还请指教!
用字节数组就没问题了,另外你可尝试减小每个包,也许缓冲区不够呢。
还一种可能是:你没等接收方应答并处理完相应的系统事件(包括清空缓冲区,必要时应插入DoEvents函数),发送方就继续发送下一个包了,这会造成接收方缓冲溢出并将数据切断的。好象通过CommEvent检测到comEventRxOver值,可发现这个问题。
所以大数据文本传输时一定也要用字节数组(非文本当然只能用字节数组),而且转成数组前也要注意一个编码转换的问题,最佳方案是都用ANSI编码:
发送端用
Dim a() As Byte
a = StrConv(Txt, vbFromUnicode)
发送a接收端用
Txt=(a,vbUnicode)
转回String这时的a应该是已接收完成的全部数据,不然又会有乱码。
当然,若是数据更大,建议存入文件,那就更简单了,接收端每次读完缓冲直接将a用Binary方式写入文件最后,就行了,不必转换。
楼上说的传输大量数据我明白了,但是对于如何传文件,还是有些不太明白,你能再说的详细些吗?
谢谢!
从楼上的表述中,我的理解似乎是将接收的数据用Binary方式写入文件,那么对于传送方是以何种方式传送呢?
不过,我觉得每次发送内容尽量少一些(多发送几次就是了),应该没有上面的麻烦,你的问题很可在于每发送内容过大,超出缓冲区,或缓冲区来不及清空,下次数据又来了,造成的。一定要留给系统清空缓冲区的机会(可用DoEvents),不然在连续的循环中,虽然你要求清空缓冲区,但系统并没有机会执行,这种错误在网络通讯中也常见。