基于UDP的文件传输的设计与开发.docx
- 文档编号:29063934
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:19
- 大小:899.69KB
基于UDP的文件传输的设计与开发.docx
《基于UDP的文件传输的设计与开发.docx》由会员分享,可在线阅读,更多相关《基于UDP的文件传输的设计与开发.docx(19页珍藏版)》请在冰豆网上搜索。
基于UDP的文件传输的设计与开发
运算机网络综合课程设计报告
基于UDP协议的文件传输系统的设计与实现
学生姓名:
指导教师:
所在系:
电子信息系
所学专业:
电子信息工程
年级:
2013年6月
基于UDP的文件传输的系统的设计与实现
摘要:
该实验的任务是实现文件的传输,而且是基于UDP协议的。
所有文件在该协议下能够实现发送并正确接收。
现在需要了解的是UDP的数据包一次最多只能发送8K,因此咱们想到通过拆包和创建窗体的方式来实现文件的传输。
拆包主若是规定每一个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。
通过系统运行窗体咱们能够明白UDP不仅能够传送和接收小文件,还能够传输和接收较大的文件。
通过实验可知UDP是不靠得住的无连接传输,因此在传输进程中会发生丢包的情形,但大部份情形下传输仍是比较好的。
关键词:
UDP协议;发送文件;接收文件;拆包;Winsock控件
一、实验的相关知识
通信的模式
由于是实现点对点的文件传输,因此在程序中咱们利用的是C/S的模式来实现通信。
关于C/S的模式,即分为客户端和效劳端。
效劳端用来接收客户端的连接,实现两头之间相互传输文件。
采纳C/S的模式能够更好的表现程序的功能设计思想,充分挪用在LAN中的server和client两方面的处置能力,极大的减少网络上的信息流通量。
C/S体系结构有可能提供一种开放式的、易伸缩扩展的散布式运算机环境,并爱惜硬件等投资。
UDP协议
该实验文件传输是在UDP协议下进行的,UDP提供无连接不靠得住的用户数据包传输。
其中每一个数据段只有8Byte相关于TCP传输开销较少,且不必对发送速度进行治理。
UDP发送数据的速度仅仅受限于程序产生数据的速度,信源主机的性能及internet上能够利用的宽带。
而且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳固性不行,易丢包。
Winsock控件
Winsock即WindowsSockets标准的简称,是目前最流行的网络通信应用程序接口之一。
所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过“套接字”向网络发出请求或应答网络请求。
Socket是网络上运行的两个程序间双向通信的一端,它既能够同意请求,也能够发送请求,利用它能够较为方便的编写网络上数据的传递。
Winsock控件工作在传输层上,在这一层上,目前要紧流行的协议包括TCP和UDP两种:
TCP协议适用于那些关于数据的靠得住性要求比较高的情形,目前大多数的网络应用层协议都是基于TCP协议的(例如经常使用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据靠得住性要求不高而对速度要求较高的情形,那个地址要紧包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。
Winsock控件重要属性、方式和事件
(1)属性
Protocol:
通过Protocol属性能够设置WinSock控件连接远程运算机利用的协议。
可选的协议是TCP和UDP,对应的VB中常量别离是sckTCPProtocol和sckUDPProtocol,Winsock控件默许协议是UDP。
RemoteHostIP:
返回远程运算机的IP地址。
本实验利用的是UDP协议,那么当DataArrival事件后,发送UDP报文的运算机的IP才赋给了那个属性。
若是是TCP协议,在客户端,当利用了控件的Connect方式后,远程运算机的IP地址就赋给了RemoteHostIP属性,而在效劳器端,当ConnectRequest事件后,远程运算机(客户端)的IP地址就赋给了那个属性。
ByteReceived:
返回当前接收缓冲区中的字节数。
State:
用于返回当前WinSock控件的状态。
常数
值
描述
sckClosed
0
缺省值,关闭
SckOpen
1
打开
SckListening
2
侦听(TCP)
sckConnectionPending
3
连接挂起(TCP)
sckResolvingHost
4
识别主机
sckHostResolved
5
已识别主机
sckConnecting
6
正在连接(TCP)
sckConnected
7
已连接(TCP)
sckClosing
8
同级人员正在关闭连接(TCP)
sckError
9
错误
表1-1
(2)方式
Bind:
用Bind方式能够把一个端口号固定为本控件利用,使得别的应用程序能再利用那个端口。
Listen:
只在利用TCP协议时有效。
它将应用程序置于监听检测状态。
Connect:
当本地运算机希望和远程运算机成立连接时,就能够够挪用Connect方式。
Accept:
当效劳器接收到客户端的连接请求后,效劳器有权决定是不是同意客户端的
请求。
SendData:
当连接成立后,要发送数据就能够够挪用SendData方式,该方式只有一个参
数,确实是要发送的数据。
GetData:
当本地运算机接收到远程运算机的数据时,数据寄存在缓冲区中,要从缓
冲区中掏出数据,能够利用GetData方式。
PeekData:
和GetData方式类似,但PeekData在取得数据后并非把缓冲区清空。
(3)事件
ConnectRequest:
(TCP)
当本地运算机接收到远程运算机发送的连接请求时,控件的ConnectRequest事件将会被触发。
SendProgress:
当一端的运算机正在向另一端的运算机发送数据时,SendProgress事件将
被触发。
SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。
SendComplete:
当所有数据发送完成时,被触发。
DataArrival:
当做立连接后,同意到了新数据就会触发那个事件。
注意:
若是在同意到
新数据前,缓冲区中非空,就可不能触发那个事件。
Error:
当在工作中发生任何错误都会触发那个事件。
Winsock控件通信的工作原理 Winsock控件是基于Socket标准创建的,因此其通信的实质是对Socket接口进行数据的读写操作。
若是两个应用程序需要通信,它们能够通过利用Socket类来成立套接字连接,能够将那个进程想象为一次呼唤进程:
呼唤者通过拨号与被呼唤者连接,当接通时,两边都能够自由通话了,只只是那个地址的呼唤者被称为“客户”,被呼唤者那么称为“效劳器”,而号码那么为“IP地址+端口”,但在成立连接之前,必需由“客户”发出呼唤,且现在的“效劳器”正在监听。
注意端口号被规定在0~65535范围内的某一个整数,其中0~1023被预先概念的效劳器通信所占用(如telnet占用23,http占用端口80),因此最好利用1024~65535这些端口中的某一个,以避免发生端口冲突。
commomdialog控件
CommonDialog控件提供一组标准的操作对话框,进行诸如打开和保留文件,设置打印选项,和选择颜色和字体等操作。
通过运行Windows帮忙引擎控件还能显示帮忙。
语法 CommonDialog控件在VisualBasic和MicrosoftWindows动态链接库.的例程之间提供了一个接口。
为了用那个控件创建一个对话框,.必需在MicrosoftWindows的SYSTEM目录下。
在应用程序中要使用CommonDialog控件,可将其添加到窗体中并设置其属性。
控件所显示的对话框由控件的方法确定。
在运行时,当相应的方法被调用时,将显示一个对话框或是执行帮助引擎;在设计时,CommonDialog控件是以图标的形式显示在窗体中。
该图标的大小不能改变。
如果该控件不在“工具箱”中,请按CTRL+T键或使用菜单:
工程-部件,显示“部件”对话框。
在这个“部件”对话框中,选择 "MicrosoftCommonDialogControl“。
使用指定的方法,CommonDialog控件能够显示下列对话。
方法所显示的对话框ShowOpen显示“打开”对话框ShowSave显示“另存为”对话框ShowColor显示“颜色”对话框ShowFont显示“字体”对话框ShowPrinter显示“打印”或“打印选项”对话框ShowHelp调用Windows帮助引擎
在对话框接口上单击,CommonDialog控件将自动提供与上下文有关的帮忙:
单击题目栏中的“这是什么?
”帮忙按钮,然后单击想详细信息的项目。
将鼠标放在想进一步详细信息的项目上,单击右键,然后在所显示的上下文菜单中选择这是什么命令。
操作系统提供在Windows95帮助弹出中显示的文本。
也可以通过设置Flags属性,在带有CommonDialog控件的对话框中显示一个帮助按钮,但是,必须在这个位置提供帮助主题。
timer控件
Timer控件(最要紧的确实是enabled属性,和Interval属性,下面有详细介绍)通过引发Timer事件,Timer控件能够有规律地隔一段时刻执行一次代码。
Enabled属性返回或设置一个值,该值用来确定一个窗体或控件是否能够对用户产生的事件作出反应。
Interval属性返回或设置对Timer控件的计时事件各调用间的毫秒数。
说明:
能够在设计时或在运行时设置Timer控件的Interval属性。
利用Interval属性时,请记住:
Timer控件的Enabled属性决定该控件是否对时间的推移做响应。
将Enabled设置为False会关闭Timer控件,设置为True则打开它。
当Timer控件置为有效时,倒计时总是从其Interval属性的设置值开始。
创建Timer事件程序用以告诉VisualBasic在每次Interval到时该做什么。
二、实验原理
实验设计进程中主若是通过Winsock控件进行UDP文件传输。
别离在发送端和接收端成立控件Winsock,通过对Winsock控件程序的写入,然后通过端口号和IP地址的绑定来成立联系,而无需像TCP一样成立连接,直接能够传送文件,而且能较准确的发送和接收。
以下图是UDP数据报的封装:
三、实验步骤
整体计划
依照该实验的要求在UDP协议下实现文件的传输。
本程序的文件传输系统的实现应包
含udp谈天,上传文件,接收文件等几个部份,整个程序采纳VB完成。
程序利用流式套接字。
在设计时设计选中文件界面中,传输并接收完成界面一个客户端即可用于用于发送文件,也可用于接收文件。
在通信的时候要紧能够分为两个部份,一个部份是操纵信息的传输部份,而另一个部份确实是文件的传输部份。
传送的操纵信息能够包括发送文件的请求,文件的名称、大小等,由于这方面的数据量比较小,因此采纳了VB所提供的WINSocket类的串行化技术来实现。
关于文件的传输,由于数据量相对来讲比较大,因此用两个线程来实现文件的传输,一个线程用于发送,一个线程用于接收。
模块设计
(1)效劳端模块
效劳端要与客户端进行通信,第一,必需明白客户端的域名或IP地址(RemoteHost属性),就像要和某人打前,必需明白对方的号码;第二,还必需和客户端进行端口绑定,也确实是端口号要匹配,如此传送的文件才能抵达客户端。
而且每一个文件都有自己文件的长度和大小等。
且能传送任意磁盘中任意文件夹中的文件。
(2)客户端模块
一样地,客户端也需要有效劳端的端口号和IP地址,而且还能把接收到的文件放到自己想要的磁盘中。
创建窗体
1)Udp聊天窗口
Udp谈天窗口要有发送和接收窗口能要有远程IP端口地址、发送端口号、接收端口号、发送和接收文件所处位置、发送按键、Winsock等
图
2)发送窗体
窗体要有选择文件的控件commomdialog,要有返回谈天的功能
图
3)接收进程
要有传送进程的可视化界面
图
程序设计
在窗口建好的情形下相应的编写程序,在程序中关键是发送和接收,而数据传输进程关键方式是拆包,用VB能够写出拆包发送和接收程序段。
1)udp谈天程序段如下:
PrivateSubCommand1_Click()
=sckUDPProtocol
=
=False
EndSub
PrivateSubCommand2_Click()
Dimdata,a,bAsString
data====a
=b
OnErrorResumeNext
data
EndSub
PrivateSubCommand3_Click()
EndSub
PrivateSubCommand4_Click()
End
EndSub
PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)
DimdataAsString
DimipAsString,portAsLong
OnErrorResumeNext
data
ip===+ip+":
"+CStr(port)+":
"+data+vbCrLf
IfLen>1000Then
=""
EndIf
EndSub
2)文件选择上传界面程序如下:
OptionExplicit
PrivateTypebyte_file
indexAsLong
arr_byte()AsByte
EndType
PrivateDeclareFunctionGetTickCountLib"kernel32"()AsLong
Privatearr_bytefile()Asbyte_file
PrivatelfilesizeAsLong
PrivateSubcmdback_Click()
EndSub
PrivateSubCommand2_Click()
="应用程序|*.exe"
If<>""Then:
=True
EndSub
PrivateSubCommand3_Click()
=False
=False
CallFileToArray
"#File#"&Str(lfilesize)&"|10"
CallSendFile
EndSub
PrivateSubForm_Load()
==10086
=10085
==1000
1001
=False
EndSub
PrivateSubFileToArray(ByValFileNameAsString)
DimlChunckAsLong
DimlRestAsLong
DimindexAsLong
lfilesize=CLng(FileLen(FileName))
lChunck=FileLen(FileName)\1024
lRest=FileLen(FileName)Mod1024
OpenFileNameForBinaryAs#1
Forindex=1TolChunck
ReDimPreservearr_bytefile(index)
arr_bytefile(index).index=index
ReDimarr_bytefile(index).arr_byte(1To1024)
Get#1,,arr_bytefile(index).arr_byte
Next
IflRest>0Then
ReDimPreservearr_bytefile(index)
arr_bytefile(index).index=index
ReDimarr_bytefile(index).arr_byte(1TolRest)
Get#1,,arr_bytefile(index).arr_byte
EndIf
Close
EndSub
PrivateSubWait(ByValSecAsInteger)
DimltickAsLong
ltick=GetTickCount
Do
DoEvents
LoopUntilGetTickCount-ltick>=Sec
EndSub
PrivateSubSendFile()
DimlAsLong
DimiAsInteger
Forl=1ToUBound(arr_bytefile)
arr_bytefile(l).arr_byte
Wait
(1)
="index:
"&Str(l)&"chunksize:
"&_
UBound(arr_bytefile(l).arr_byte)&"byte"&vbCrLf
Next
=True
EndSub
3)文件接收程序如下
OptionExplicit
PrivateTypebyte_file
indexAsLong
arr_byte()AsByte
EndType
PrivatenAsLong
PrivatelReceivedAsLong
PrivatelTotalAsLong
Privatearr_bytefile()Asbyte_file
PrivateSubForm_Load()
===10085
=10086
=1001
=1000
="%"
="速度:
"&"0KB/S"
="剩余时刻:
计算中..."
lReceived=0
lTotal=0
=False
n=0
=False
EndSub
PrivateSublblProg_Change()
=-/2
EndSub
PrivateSubWriteFile(ByValPathAsString)
DimlAsLong
OpenPathForBinaryAs#1
Forl=1ToUBound(arr_bytefile)
Put#1,,arr_bytefile(l).arr_byte
Next
Close
EndSub
PrivateSubTimer2_Timer()
DimSecAsInteger
DimMinAsInteger
DimlRestAsLong
IflTotal=0Then
CallWriteFile("d:
\")
MsgBox"传送完毕!
",vbInformation
UnloadMe
Shell"d:
\",vbNormalFocus
EndIf
="速度:
"&Int((lTotal/1024))&"KB/S"
lRest=-lReceived
IflTotal=0ThenExitSub
Sec=Int((lRest/1024)/(lTotal/1024))
IfSec<0ThenExitSub
Min=Sec\60
Sec=SecMod60
IfMin>0Then
="剩余时刻:
"&Format(Str(Min),"00")&"分"&Format(Str(Sec),"00")&"秒"
Else
="剩余时刻:
"&Format(Str(Sec),"00")&"秒"
EndIf
lTotal=0
EndSub
PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
strData,vbString
strData
=strData
IfLeft(UCase(strData),6)="#FILE#"Then
=Val(Mid(strData,InStr(strData,"")+1))
EndIf
EndSub
PrivateSubWinsock2_DataArrival(ByValbytesTotalAsLong)
Dimarr_byte()AsByte
ReDimarr_byte(bytesTotal-1)
n=n+1
arr_byte
ReDimPreservearr_bytefile(n)
arr_bytefile(n).index=n
ReDimarr_bytefile(n).arr_byte(1TobytesTotal)
arr_bytefile(n).arr_byte=arr_byte
arr_byte
=True
lTotal=lTotal+bytesTotal
lReceived=lReceived+bytesTotal
="index:
"&n&"size:
"&Str(bytesTotal)&"byte"&vbCrLf
(0,0)-(lReceived,1),,BF
=Format(Str((lReceived/*100),"")&"%"
EndSub
系统运行
不断将程序完善直到能够进行运行,系统运行结果如图是数据发送完毕情形图是数据接收完毕情形
图
四、实验结论
刚开始拿到题目时全然无从下手,后来通过教师的讲解,明白咱们那个实验能够通过Winsock控件来实现,大致了解了整个框架。
但咱们对控件的运用不是很清楚,于是去图书馆查阅相关资料、上网搜索相关知识,对Winsock控件有了一个大体的了解。
于是慢慢去构思,一步一步去实现基于UDP的文件传输,并大体成功了。
实验中咱们了解到UDP传输文件的大小是有界限的,而这一问题能够通过数据拆包的方式来解决。
通过这一实验,咱们了解到团队精神的重要性,同时强化了自己的动手能力和编程能力。
对Winsock控件有了更进一步的了解,并大体学会了该控件的运用。
也明白了文件传输的工作原理,同时也了解到数据库和运算机网络结合的重要性,对以后的从事这方面工作有实在际的意义。
最后咱们也慢慢体会到解决一个难题是要有足够的耐心和毅力的,同时要具有足够的理论知识和实际操作的能力,慢慢去积存这方面的体会是很有必要的。
五、参考文献
[1]崔彦锋,许小荣.VB网络与远程操纵编程实例教程[M].北京:
北京希望电子出版社,~65
[2]卞志强.VisualBasic网络程序设计[M].北京:
人民邮电出版社,~93
[3]肖斌,董磊.VisualBasic6网络编程实例教程[M]北京:
北京希望电
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 UDP 文件传输 设计 开发