Mail to Keith Dan
keith的天空
海阔凭鱼跃,天高任鸟飞
上次谈到如何传输图象
那么如果是文件呢?很显然不能使用序列化的模式,因为序列化其实是把数据序列到内存中,随着数据的增大,对内存的占用也会加大,所以这是不可取的.
对于文件传输,对于TCP/IP协议传输比较简单,那么我们可以把他们读到FileStream里面,通过文件流读取的方法.那么今天我想说的是关于UDP模式下对于文件安全传输的问题.什么是UDP?UDP是数据报,它不需要知道对方是否在线,只考虑单方面的发送或者接收,那么它对于TCP/IP协议的优势在于效率很高,但是确不能保证数据的准确传输.
那么在UDP协议要对文件安全传输怎么办呢?这就是今天讨论的话题.
首先我们了解了UDP协议的特性以后,那么我们将考虑如何做到数据发送和接受安全.这里的先讲是接收.
我们必须要考虑的几个问题:
1.文件是否都收到了?
2.文件是否有重复部分?
3.如果有多个文件,那么第2个文件的数据头在那里?
面对这3个问题,应该说是在UDP传输里面很重要的.
1文件收到与否,我们可以比队文件的大小,那么我们首先需要知道待传输的文件总大小是多大?那么我们可以在传输数据加上一个数据头
    数据大小(64)|实际数据
我们在接收以后,首先知道该文件大小,读取实际数据

2但是大家会发现,在UDP应用当中,仅靠大小的比对是很不准确的.因为在UDP协议下,漏包是平常的事,于是为了补上遗漏的数据包,我们会采用包的重发(这个在后面讲解).于是就有重复的数据包,为了能够准确的得到我们的数据,那么我们可以对每个数据包编号
    包1:(0|数据)
    包2:(1|数据)
    包3:......
通过包的序号我们得到所有的包,对于重复的包是我们所不需要的,需要丢弃,而其余的包我们写入文件流.当然,在这个过程我们需要把包头和数据分离,按照包头的顺序写入数据.那么具体有多少个包呢?我们接收的包只是顺序正确,那最后的包是不是都接收完了呢?那么我们可以通过文件的长度来计算包的个数,以确保包的数量正确.

3对于这个问题来说,可能有朋友没明白.我们的发包通过fs.Read方法从文件流里读取到一定的字节,那么最后一个可能不够我们申请的字节,那么再读下一个文件
 文件1: 
    包1:512byte
    包2:512byte
    包3:200byte    注意,在第3次读取,也就是文件1的末尾不足我们申请的字节,只有200,那么我们发送的是200字节
 文件2:
    包4:512byte    
    包5:512byte
    包6:300byte
我们在发送的过程包3只有200byte,那么接收呢,他也是这样接收的吗?很显然不是,你会收到如下的包
    bag1:512byte
    bag2:512byte
    bag3:512byte
    bag4:512byte
    bag5:500byte
很显然,文件1和文件2的发送的包在接收时合为一起了.那么这时我们必须在最后发送包加以结束标志.将拆分包3,一段作为文件1的组成部分,一段作为文件2的开始部分.
    包3:200byte->file1    312byte->file2

这里我们讲的是接收问题,主要是理论和算法实现方面,后面将讲解发送部分的实现,以及实际开发的问题
当然,这里只讲了一些基础理论,对于实际的应用还有很多需要考虑的地方,如发送来的文件名,缓存数据等等
至于实现的代码整理以后随后贴出
posted on 2007-10-27 23:01  KeithDan  阅读(1118)  评论(0编辑  收藏  举报