基于UDP的文件传输_第1页
基于UDP的文件传输_第2页
基于UDP的文件传输_第3页
基于UDP的文件传输_第4页
基于UDP的文件传输_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 计算机网络综合课程设计报告 基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所 在 系: 电 子 信 息 系 所学专业: 电子信息工程 年 级: 2013 年 6 月目录基于UDP的文件传输的系统的设计与实现3一、实验的相关知识41.1通信的模式41.2 UDP协议41.3 Winsock控件41.4 Winsock控件重要属性、方法和事件41.6 commomdialog控件61.7 timer控件7三、实验步骤83.1总体规划83.2模块设计83.3创建窗体83.4程序设计103.5系统运行14四、实验结论15五、参考文献15基于UDP的文件传输的系统的设计与实现 摘要

2、:该实验的任务是实现文件的传输,并且是基于UDP协议的。所有文件在该协议下可以实现发送并正确接收。此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。 关键词:UDP协议;发送文件;接收文件;拆包;Winsock控件 一、实验的相关知识1.1

3、通信的模式由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。对于C/S的模式,即分为客户端和服务端。服务端用来接收客户端的连接,实现两端之间互相传输文件。采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。C/S体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。1.2 UDP协议该实验文件传输是在UDP协议下进行的,UDP提供无连接不可靠的用户数据包传输。其中每一个数据段只有8Byte相对于TCP传输开销较少,且无须对发送速率进行管理。UDP发送数

4、据的速率仅仅受限于程序产生数据的速率,信源主机的性能及internet上可以利用的宽带。并且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳定性不好,易丢包。1.3 Winsock控件Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Win

5、sock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。1.4 Winsock控件重要属性、方法和事件(1) 属性Protocol:通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP,对应的VB中常量分别是sckTCP

6、Protocol和sckUDPProtocol,Winsock控件默认协议是UDP。RemoteHostIP:返回远程计算机的IP地址。本实验使用的是UDP协议,那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。如果是TCP协议,在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。ByteReceived:返回当前接收缓冲区中的字节数。State:用于返回当前WinSock控件的状态。 常数值描述sckClose

7、d0缺省值,关闭SckOpen1打开SckListening2侦听(TCP)sckConnectionPending3连接挂起(TCP)sckResolvingHost4识别主机sckHostResolved5已识别主机sckConnecting6正在连接(TCP)sckConnected7已连接(TCP)sckClosing8同级人员正在关闭连接(TCP)sckError9错误表1-1(2) 方法Bind:用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序能再使用这个端口。Listen:只在使用TCP协议时有用。它将应用程序置于监听检测状态。Connect:当本地计算机希望和远

8、程计算机建立连接时,就可以调用Connect方法。Accept:当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。SendData:当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。GetData:当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。PeekData:和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。(3) 事件ConnectRequest:(TCP)当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest事件将

9、会被触发。SendProgress:当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。SendComplete:当所有数据发送完成时,被触发。DataArrival:当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。Error:当在工作中发生任何错误都会触发这个事件。1.5 Winsock控件通信的工作原理    Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数

10、据的读写操作。如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个过程想象为一次电话呼叫过程:呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“IP地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器”正在监听。注意端口号被规定在065535范围内的某一个整数,其中01023被预先定义的服务器通信所占用(如telnet占用23,http占用端口80),所以最好使用102465535这些端口中的某一个,以免发生端口冲突。1.6 commomdialog控件C

11、ommonDialog控件提供一组标准的操作对话框,进行诸如打开和保存文件,设置打印选项,以及选择颜色和字体等操作。通过运行 Windows 帮助引擎控件还能显示帮助。语法   CommonDialog控件在Visual Basic和Microsoft Windows动态链接库ommdlg.dll. 的例程之间提供了一个接口。为了用这个控件创建一个对话框,ommdlg.dll. 必须在 Microsoft Windows 的SYSTEM目录下。在应用程序中要使用CommonDialog控件,可将其添加到窗体中并设置其属性。控件所显示的对话框由控件的方法确定。在运行

12、时,当相应的方法被调用时,将显示一个对话框或是执行帮助引擎;在设计时,CommonDialog 控件是以图标的形式显示在窗体中。该图标的大小不能改变。如果该控件不在“工具箱”中,请按 CTRL+T 键或使用菜单:工程-部件,显示“部件”对话框。在这个“部件”对话框中,选择"Microsoft Common Dialog Control“ 。使用指定的方法,CommonDialog控件能够显示下列对话。方法 所显示的对话框ShowOpen 显示“打开”对话框ShowSave 显示“另存为”对话框ShowColor 显示“颜色”对话框ShowFont 显示“字体”对话框ShowPrint

13、er 显示“打印”或“打印选项”对话框ShowHelp 调用 Windows 帮助引擎在对话框接口上单击,CommonDialog控件将自动提供与上下文有关的帮助: 单击标题栏中的“这是什么?”帮助按钮,然后单击想详细信息的项目。将鼠标放在想进一步详细信息的项目上,单击右键,然后在所显示的上下文菜单中选择这是什么命令。 操作系统提供在Windows 95帮助弹出中显示的文本。也可以通过设置Flags属性,在带有CommonDialog控件的对话框中显示一个帮助按钮,但是,必须在这个位置提供帮助主题。1.7 timer控件Timer 控件(最主要的就是enabled属性,和Interval属性,

14、下面有详细介绍)通过引发 Timer 事件,Timer 控件可以有规律地隔一段时间执行一次代码。Enabled 属性返回或设置一个值,该值用来确定一个窗体或控件是否能够对用户产生的事件作出反应。Interval 属性返回或设置对 Timer 控件的计时事件各调用间的毫秒数。说明:可以在设计时或在运行时设置 Timer 控件的 Interval 属性。使用 Interval 属性时,请记住:Timer 控件的 Enabled 属性决定该控件是否对时间的推移做响应。将Enabled 设置为 False 会关闭 Timer 控件,设置为 True 则打开它。当 Timer 控件置为有效时,倒计时总是

15、从其 Interval 属性的设置值开始。创建 Timer 事件程序用以告诉 Visual Basic 在每次 Interval 到时该做什么。二、实验原理实验设计过程中主要是通过Winsock控件进行UDP文件传输。分别在发送端和接收端建立控件Winsock,经过对Winsock控件程序的写入,然后通过端口号和IP地址的绑定来建立联系,而无需像TCP一样建立连接,直接可以传送文件,而且能较准确的发送和接收。下图是UDP数据报的封装:三、实验步骤3.1总体规划根据该实验的要求在UDP协议下实现文件的传输。本程序的文件传输系统的实现应包含udp聊天,上传文件,接收文件等几个部分,整个程序采用VB

16、完成。程序使用流式套接字。在设计时设计选中文件界面中,传输并接收完成界面一个客户端即可用于用于发送文件,也可用于接收文件。在通信的时候主要可以分为两个部分,一个部分是控制信息的传输部分,而另一个部分就是文件的传输部分。传送的控制信息可以包含发送文件的请求,文件的名称、大小等,由于这方面的数据量比较小,因此采用了VB所提供的WINSocket类的串行化技术来实现。对于文件的传输,由于数据量相对来说比较大,所以用两个线程来实现文件的传输,一个线程用于发送,一个线程用于接收。3.2模块设计(1)服务端模块服务端要与客户端进行通信,首先,必须知道客户端的域名或IP地址(RemoteHost属性),就像

17、要和某人打电话前,必须知道对方的电话号码;其次,还必须和客户端进行端口绑定,也就是端口号要匹配,这样传送的文件才能到达客户端。而且每个文件都有自己文件的长度和大小等。且能传送任意磁盘中任意文件夹中的文件。(2)客户端模块同样地,客户端也需要有服务端的端口号和IP地址,而且还能把接收到的文件放到自己想要的磁盘中。3.3创建窗体1)Udp聊天窗口Udp聊天窗口要有发送和接收窗口能要有远程IP端口地址、发送端口号、接收端口号、发送和接收文件所处位置、发送按键、Winsock等图3.12)发送窗体窗体要有选择文件的控件commomdialog,要有返回聊天的功能图3.23)接收过程要有传送过程的可视化

18、界面 图3.3 3.4程序设计在窗口建好的情况下相应的编写程序,在程序中关键是发送和接收,而数据传输过程关键方法是拆包,用VB可以写出拆包发送和接收程序段。1)udp聊天程序段如下: Private Sub Command1_Click()Me.Winsock1.Protocol = sckUDPProtocolMe.Winsock1.LocalPort = Me.txtlocalportMe.Winsock1.BindMe.Command1.Enabled = FalseEnd SubPrivate Sub Command2_Click()Dim data, a, b As Stringda

19、ta = Me.Text1.Texta = Me.TxtIP.Textb = Me.txtremoteport.TextMe.Winsock1.RemoteHost = aMe.Winsock1.RemotePort = bOn Error Resume NextMe.Winsock1.SendData dataEnd SubPrivate Sub Command3_Click()Form2.ShowEnd SubPrivate Sub Command4_Click()EndEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As

20、Long)Dim data As StringDim ip As String, port As LongOn Error Resume NextMe.Winsock1.GetData dataip = Me.Winsock1.RemoteHostIPport = Me.Winsock1.RemotePortMe.Text2.Text = Me.Text2.Text + ip + ":" + CStr(port) + ":" + data + vbCrLfIf Len(Me.Text2) > 1000 ThenMe.Text2 = "&q

21、uot;End IfEnd Sub2)文件选择上传界面程序如下:Option ExplicitPrivate Type byte_file index As Long arr_byte() As ByteEnd TypePrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate arr_bytefile() As byte_filePrivate lfilesize As LongPrivate Sub cmdback_Click()Form1.ShowEnd SubPrivate Sub C

22、ommand2_Click() cdg.Filter = "应用程序|*.exe" cdg.ShowOpen If cdg.FileName <> "" Then: Command3.Enabled = TrueEnd SubPrivate Sub Command3_Click() Command2.Enabled = False Command3.Enabled = False Call FileToArray(cdg.FileName) Form3.Show Winsock1.SendData "#File# " &a

23、mp; Str(lfilesize) & "|10" Call SendFileEnd SubPrivate Sub Form_Load() Winsock1.RemoteHost = Form1.TxtIP.Text Winsock1.RemotePort = 10086 Winsock1.LocalPort = 10085 Winsock1.Bind Winsock2.RemoteHost = Form1.TxtIP.Text Winsock2.RemotePort = 1000 Winsock2.Bind 1001 Command3.Enabled = Fal

24、seEnd SubPrivate Sub FileToArray(ByVal FileName As String) Dim lChunck As Long Dim lRest As Long Dim index As Long lfilesize = CLng(FileLen(FileName) lChunck = FileLen(FileName) 1024 lRest = FileLen(FileName) Mod 1024 Open FileName For Binary As #1 For index = 1 To lChunck ReDim Preserve arr_bytefil

25、e(index) arr_bytefile(index).index = index ReDim arr_bytefile(index).arr_byte(1 To 1024) Get #1, , arr_bytefile(index).arr_byte Next If lRest > 0 Then ReDim Preserve arr_bytefile(index) arr_bytefile(index).index = index ReDim arr_bytefile(index).arr_byte(1 To lRest) Get #1, , arr_bytefile(index).

26、arr_byte End If CloseEnd SubPrivate Sub Wait(ByVal Sec As Integer) Dim ltick As Long ltick = GetTickCount Do DoEvents Loop Until GetTickCount - ltick >= SecEnd SubPrivate Sub SendFile() Dim l As Long Dim i As Integer For l = 1 To UBound(arr_bytefile) Winsock2.SendData arr_bytefile(l).arr_byte Wai

27、t (1) Text1.SelText = "index: " & Str(l) & " chunk size: " & _ UBound(arr_bytefile(l).arr_byte) & "byte" & vbCrLf Next Command2.Enabled = TrueEnd Sub3) 文件接收程序如下Option ExplicitPrivate Type byte_file index As Long arr_byte() As ByteEnd TypePrivate n As

28、 LongPrivate lReceived As LongPrivate lTotal As LongPrivate arr_bytefile() As byte_filePrivate Sub Form_Load() Winsock1.RemoteHost = Form1.TxtIP.Text Winsock2.RemoteHost = Form1.TxtIP.Text Winsock1.RemotePort = 10085 Winsock1.LocalPort = 10086 Winsock1.Bind Winsock2.RemotePort = 1001 Winsock2.LocalP

29、ort = 1000 Winsock2.Bind lblProg.Caption = "0.0%" lblSpeed.Caption = "速度: " & "0KB/S" lblTime.Caption = "剩余时间: 计算中." lReceived = 0 lTotal = 0 Timer2.Enabled = False n = 0 Me.Enabled = FalseEnd SubPrivate Sub lblProg_Change() lblProg.Left = (picProg.ScaleWi

30、dth - lblProg.Width) / 2End SubPrivate Sub WriteFile(ByVal Path As String) Dim l As Long Open Path For Binary As #1 For l = 1 To UBound(arr_bytefile) Put #1, , arr_bytefile(l).arr_byte Next CloseEnd SubPrivate Sub Timer2_Timer() Dim Sec As Integer Dim Min As Integer Dim lRest As Long If lTotal = 0 T

31、hen Call WriteFile("d:download.exe") MsgBox "download.exe 传送完毕!", vbInformation Unload Me Shell "explorer.exe d:", vbNormalFocus End If lblSpeed.Caption = "速度: " & Int(lTotal / 1024) & "KB/S" lRest = picProg.ScaleWidth - lReceived If lTotal =

32、 0 Then Exit Sub Sec = Int(lRest / 1024) / (lTotal / 1024) If Sec < 0 Then Exit Sub Min = Sec 60 Sec = Sec Mod 60 If Min > 0 ThenlblTime.Caption = "剩余时间: " & Format(Str(Min), "00") & "分" & Format(Str(Sec), "00") & "秒" Else lblTi

33、me.Caption = "剩余时间: " & Format(Str(Sec), "00") & "秒" End If lTotal = 0End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim strData As String Winsock1.PeekData strData, vbString Winsock1.GetData strData Text1.SelText = strData If Left(UCase(strDat

34、a), 6) = "#FILE#" Then picProg.ScaleWidth = Val(Mid(strData, InStr(strData, " ") + 1) End IfEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim arr_byte() As Byte ReDim arr_byte(bytesTotal - 1) n = n + 1 Winsock2.PeekData arr_byte ReDim Preserve arr_bytefile(n) arr_bytefile(n).index = n ReDim arr_bytefile(n).arr_byte(1 To bytesTotal) arr_bytefile(n).arr_byte = arr_byte Winsock2.GetData arr_byte Timer2.Enabled = True lTotal = lTotal + bytesTotal lReceived = lReceived

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论