这两天忙里偷闲,写了一个全网实现UPD文件的传输.
首先文件发送必须有发送端(下面都叫它为Sender)和接收端(下面都叫它为Accepter),两都都各自启动一个DatagramSocket端口监听.它们之间的传输是基于DatagramPacket的,所以为了能够解释这个包,我们必须自定义一些包,以便于能够识别包.
下面这些包是我自己定义的:
主要有如下这些包:
FileInfoDataPakcet(文件信息包),FileDataPacket(文件数据包),ResponseFileInfoDataPakcet(响应文件信息包),
RequestFileDataPacket(请求文件包),TransStatusDataPacket(请求传输状态包),以及ResponseTransStatusDataPacket(响应请求传输状态包),下面分别来解释它们
FileInfoDataPacket: 一个是当Sender发送文件给Accepter时,它要先发送一个关于文件信息的包,如文件大小,文件名,文件分成几块.
ResponseFileInfoDataPakcet(响应文件信息包):Accepter收到文件之后,就要做出响应,是拒绝或者接受,但无论是拒绝或者接受,都要发一条响应包给Sender,这个消息包就是(ResponseFileInfoDataPacket).Sender收到之后,如果是拒绝文件包,就删除任务,如果对方接受文件,就要开始等待对方过来的请求包RequestFileDataPacket(请求文件包),
RequestFileDataPacket(请求文件包):请求文件包是Accepter发出的,它表求要请要Sender发文件的第一个包,然后收到之后,就用RandomAccessFile写入文件.写这个文件的过程可能会发生两种情况,一种是用户中断了,另外是一种传输完成正的中止,这时还要发消息告诉Sender说,我已经中断了此任务,或者文件已经传输完成,这个消息包就是TransStatusDataPacket(请求传输状态包)
TransStatusDataPacket(请求传输状态包):它就是Accepter中断文件传输或者文件传输完成时发给Sender给示对方能够移除正在进行的任务.
ResponseTransStatusDataPacket(响应请求传输状态包):当Sender收到请求传输状态包后,还要发一个响应包给Accepter通知Accepeter把请求传输状态包删除.当然这些事情都是基于线程而做的.
小结:
1.UDP传输文件会比较麻烦,它不像TCP那么稳定,在网络不稳定的情况下,用UDP传输文件才比较符合实际(当然也不排除特殊情况).UDP传输需要考虑丢包情况,以及如何处理在丢包时重发数据包.
2.数据发送时,有的数据需要对方回复,在网络不稳定的情况下,我们就需要不断的给对方发数据包,直到有数据回复,这就要让线程去做,如果收到对方回复之后我们才停止发包.