欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    基于TCP的文件传输实验报告.docx

    • 资源ID:845432       资源大小:88.48KB        全文页数:13页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于TCP的文件传输实验报告.docx

    综合课程设计报告基于TCP协议的文件传输系统学生姓名:指导教师:所在系:所学专业:年级:2011年6月目录摘要21、实验的相关知强31.1、通信的模式31.1.1、 传输的可靠性31. 2.1、TCP/IP的网络体系结构3、TaVlP网络协议41.2. 3、TCP传输控制协议42,winsock控件51. 1.1、WinSOCk的重要属性、方法和事件52. 1.2、winsock控件通信的工作原理73. 3、程序设计与实现84. 1.程序设计8、总体设计8、模块设计94.2、 程序实现LO、工作原理10、效劳器端主程序11、客户端主程序144、实验息结17参考文献17.成绩评定.18基于TCP协议的文件传输系统摘要随着网络的普及,网络编程显得尤其重要。本实验使用Winsock控件实现两台计算机间的文件传输,描述了Winsock控件的使用方法及有关文件传输的算法。随着计算机网络的迅速开展,人们的生活越来越离不开网络,如今网络编程已成为计算机开展的热点,而在众多的网络通信中,又以TCP/1P协议最为流行。本文讨论的WinSoCk控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/1F的细节和调用WinsockAPI,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信,进行文件传输了。同时为了便于传输文件过程中的中断现象,在实验时应该充分考虑断点续传问题,即中断文件传输后已经传输的文件不丧失,等到再传时,能继续接着传送。关能词:TCP/IP协议,Winsock控件,网络编程,文件传输,断点续传。1、实验的相关知识1.1 通信的模式由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。对于C/S的模式,即分为客户端和效劳端。效劳端用来接收客户端的连接,实现两端之间互相传输文件。采用c/s的模式可以更好的表达程序的功能设计思想,充分调用在LAN中的SerVer和client两方面的处理能力,极大的减少网络上的信息流通量。C/S体系结构有可能提供-种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。1.1.1 传输的可靠性要想实现文件的可靠性传输,可以使用流式套接字。因为流式套接字提供面向连接的、无过失的、发送顺序一致的、包长度不限和非重复的网络信息的传输,能提供更好的可靠性。而对于数据报套接字提供的是无连接的效劳,以独立的数据报进行传输,不保证顺序性、可靠性和无重复性,相比之下用流式套接字能提供更好的的可靠性传输。1、2、ITCP/IP的网络体系结构TCP/IP协议采用层次体系结构,如图1所示,从图中可以看出,每一层在逻辑上都与通信端的对应层相连接图中所示的效劳器程序持续监听通信客户端;客户端仅周期性地与效劳器相连接以交换数据,其中TCP协议层提供相当于OSl参考模型中传输层的效劳,为收、发端应用程序提供通信;IP协议层负责提供统一的数据报;链路层主要功能是收、发IP层的IP数据报;TCP/IP之上是该协议提供的各种效劳,而底层网络可以是不同的物理网络,如Ethernet、TokenRing、X.25公共分组交换网等。图1TCP/IP协议层模型(LAN)1、2、2TCP/IP网络协议协议是对等的网络实体之间通信的规那么,可以简单地理解为网络上各计算机彼此交流的一种“语言"。网络通信协议设计的根本原那么是层次化,层和协议的集合被称为网络体系结构。相邻层之间的接口定义了下层向上层提供的根本操作和效劳,下层向上层提供的效劳分两种形式:面向连接的效劳和无连接的效劳。计算机网络中己经形成的网络体系结构主要有两个:OSl参考模型和TCP/IP参考模型。TCP/IP参考模型是因特网(Internet)的根底。和OSl的7层协议相比,TCP/IP协议只有4个层次。通常说的TCP/IP是一组协议的总称,TCP/IP实际上是一个协议族,包括100多个相互关联的协议,其中IP(InternetProtocol,网际协议)是网络层最主耍的协议;TCP(TranSmiSSiOnControlProtoCOl,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议是传输层中最主要的协议),一般认为IP、TCP、UDP是最根本的三种协议,是其他协议的根底。TCP一传输控制协议面向连接的通信可以使用可靠通信,在这时候,第四层协议发送数据接收方确实认,如果未收到数据或者数据被损坏,那么请求重新传输。TCP协议就使用这种可靠通信。使用TCP协议的应用层协议包括、FTP、SMTP和TeInet等。TCP要求在发送数据之前必须翻开连接。效劳器应用程序必须执行一个称作被动翻开(passiveOPen)的操作,以利用一个的端口号创立一个链接,这是,效劳器并不是对网络进行呼叫,而是侦听并等待引入的请求。客户应用程序必须执行一个主动翻开(activeopen),为此,它向效劳器应用程序发送一个同步序列号(SYN)以标识连接。客户应用程序可以将动态端口号作为本地端口使用。效劳器必须向客户发送一个确认(ACK)以及效劳器的序列号(SYN)«随后,客户回复一个ACK,这样就建立了链接。现在可以发送和接收消息了。接收消息后,总是返回ACK消息。如果在收到ACK之前发送方己经超时,那么消息将被放到重发队列中以再次发送。由于它的握制,所以TCP协议比拟复杂并且费时,但此协议在处理数据时对数据包的传送有保障,从而使得在应用程序协议中不需要再包括该功能2. Winsock控件Winsock即WindowsSockets标准的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Minsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比拟高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的、FTP、SMTP、POP3等协议):UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。3. 1.1WinSOCk控件重要属性、方法和事件(1)属性Protocol:通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP,对应的VB中常量分别是SCkTCPPrOtoCol和SCkUDPPrOtOCol,WinSOCk控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。SocketHandle:SOCketHandle返回当前socket连接的句柄,这是只读属性。RemoteHostTP:返l3l远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostTP属性,而在效劳器端,当ConnectRequest事件后,远程计算机(客户端)的TP地址就赋给了这个属性.如果使用的是UDP协议那么当DataArriVal事件后,发送UDP报文的计算机的IP才赋给了这个属性。ByteReceived:返Rl当前接收缓冲区中的字节数。State:用于返回当前WinSock控件的状态。如表2T所示。表1-1返51WinSoCk控件当前的状态常数值描述SckClosedQ缺省值,关闭SckOpen1翻开SckIJStening2侦听SckConnectionPending3连接挂起SckResolvingHost4识别主机SckHostResolved5己识别主机SckConnecting6正在连接SckConnected7己连接SckClosing8同级人员正在关闭连接SckError9错误(2)方法Bind:用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序能再使用这个端口。1.isten:只在使用TCP协议时有用。它将应用程序置于监听检测状态。Connect:当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Accept:当效劳器接收到客户端的连接请求后,效劳器有权决定是否接受客户端的请求。SendData:当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。GetData:当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GelDaIa方法。PeekData:和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。(3)事件ConnectRequest:当本地计算机接收到远程计算机发送的连接请求时,控件的COnneCtReqUeSt事件将会被触发。SendProgress:当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。SendFrogress事件记录了当前状态下已发送的字节数和剩余字节数。SendComplete:当所有数据发送完成时,被触发。DataArrival:当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。Error:当在工作中发生任何错误都会触发这个事件。2. 1.2WinSoCk控件通信的工作原理WinSOCk控件是基于SoCket标准创立的,所以其通信的实质是对SoCket接口进行数据的读写操作。如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个过程想象为一次呼叫过程:呼叫者通过拨号与被呼叫者连接,当接通时,双方都可以自由通话了,只不过这里的呼叫者被称为"客户",被呼叫者那么称为"效劳器",而号码那么为"IP地址+端口",但在建立连接之前,必须由"客户"发出呼叫,且此时的"效劳器"正在监听。因此,基于TCP/IP协议的通信,需要分别建立客户端应用程序和效劳器端应用程序。其大致流程如图1所示:图1Winsk工作原理端口号被规定在065535范围内的某一个整数,其中01023被预先定义的效劳器通信所占用(如telnet占用23,占用端口80),所以最好使用102465535这些端口中的某一个,以免发生端口冲突。3程序设计与实现3. 1程序设计4. 1.1总体设计本程序的文件传输系统的实现应包含效劳端模块、客户端模块等儿个局部,整个程序采用VB完成。程序使用流式套接字,基于C/S模型。在设计时设计客户端和效劳端两个界面中,效劳器用于发送文件,客户端用于接收文件。效劳器和客户机的根本流程如图2所示.在通信的时候主要可以分为两个局部,一个局部是控制信息的传输局部,而另一个局部就是文件的传输局部。传送的控制信息可以包含发送文件的请求,文件的名称、大小等,由于这方面的数据量比拟小,因此采用了VB所提供的也NSoCket类的申行化技术来实现。对于文件的传输,由于数据量相对来说比拟大,所以用两个线程来实现文件的传输,一个线程用于发送,一个线程用于接收。效劳器客户机客户端要能实现的都功能应该有:能查找要传送的文件;能够侦听连接;能够与客户端建立连接:能共发送数据。客户端要与效劳器端进行通信,首先,必须知道效劳器端的域名或IP地址(RemoteHost属性),就像要和某人打前,必须知道对方的号码;其次,还必须和效劳器端约定相同的端口RemotePort属性),用于数据的输入和输出:最后,调用ConneCt方法与效劳器端建立连接。效劳器端应设置一个监听端口(LoCaIPOrt属性),端口应与客户端的端口相同,同时调用LiSten方法时刻监听客户端的连接请求(ConnectionRequest事件);当接收到客户端的连接请求时,可调用ConnectionRequest再件的Accept方法,这样与客户端的连接就建立了。(2)客户端模块客户端能实现的功能有:能够与效劳器建立连接,能够接受效劳器传来的数据:能够保存所接受的数据等。客户端和效劳器端成功建立连接后,任何一方都可以自由的发送数据(SendData方法)和接收数据(GetData方法),这些方法都在DataArriVal事件中。3.2程序的实现工作原理本实验将实现的文件传输只有一个发送方和一个接收方,这是最根本的文件传输方式,运用的原理也比拟简单:发送方先获取待传输文件的根木信息,主要是文件名及文件长度(用于创立数据缓冲区):然后,将其发送给接收方;接着,建立和文件一样大小的数据缓冲区,并将文件读入;最后,将数据缓冲区中的数据发送给接收方。与此同时,当接收方接收到文件名和文件长度之后,就为其创立新的文件和数据缓冲区;然后,接收传输的文件数据,并将其放在数据缓冲区中;最后,依次将数据缓冲区的数据写入新创立的文件中。这样便完成了不同计算机之间的文件传输。然而,当需要传送的数据比拟大时,就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的内存是无法忍受用一个几百MB甚至上GB的空间去存储那些临时数据的。这时可以将文件按照一定的大小,分成假设干个数据包(远小于内存的容量)。首先,设置数据包的大小(如64K),根据文件的根本信息主要文件的长度),计算出总共需要的数据包数:然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上:同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文件的传输了。但还有些时候,当我们在传输文件的过程中,突然被意外中断,导致网络连接中断。这时,我们又不得不再次将文件重新传输一次,显然这浪费了不少的时间,那怎样解决这类问题呢?这就涉及到"断点续传"了,即我们可以接着上次未传输完的地方,继续传输文件。"断点续传"的方法有多种,比拟常见的一种是通过设置一个临时文件,记录己经传输的文件信息,当传输文件中断时,可以通过临时文件的数据来推算出未传输的数据;然后,在每次进行文件传输前,都先查找文件是否有临时文件,并将此信息传输给效劳器端,于是效劳器端可据此再接着进行传输剩余的数据,当文件全部传输完毕时,删除临时文件,这样就实现了"断点续传"。效劳器端主程序:"通用"中声明如下:OPtiOnBase1ConstPACKSIZEAsLong=65536'每包大小为64KDimfilepathAsString,filenameAsString,filelengthAsLong'存储文件信息DimdataOASByte,packAsLong,sendAsLong'数据缓冲区,文件包数,已传输的数据“发送文件"按钮事件代码:PrivateSubSendfileClickOStatusBarl.SimplcText="向客户端发送数据"'计算需要传输文件的包数pack=Cfilclength-send)PACKSIZEIf(filelength-send)ModPACKSIZE)O0Thenpack=pack+1Ifpack=0Thenpack=pack+1'传输文件OpenfilepathForBinaryAs#1Fori=1Topack'如果只有一包Ifpack=1ThenReDimdata(fiIelength-send)'读取数据Forj=send+】TofilelengthGet#1,j,data(j-send)Next'更新己传输文件的数据send=filelength'发送文件数据WinsockLSendDatadata'如果是最后一包ElseIfi+1=packThen'读取最后一包的数据ReDimdata(fiIelength-send)Forj=1Tofilelength-sendGet#1,send+j,data(j)Next,发送文件数据Winsockl.SendDatadata'更新己传输文件的数据send=filelengthExitForElse'将文件数据放到数据缓冲区ReDimdata(PACKSIZE)Forj=1ToPACKSIZEGet#1,send+j,data(j)Next'发送文件数据Winsockl.SendDatadata'更新己传输文件的数据send=send+PACKSIZEEndIfProgressBarl.Value=Int(send/filelength)*100)NextProgressBarl.Value=Int(send/filelength)*100)Close#1EndSub'返问客户端已接收文件的数据PrivateSubWinsocklDataArrival(ByValbytesTotalAsLong)WinsockLGetDatasend,vbLongEndSub"开启"按钮事件的代码:PrivateSubstartClick()Winsockl.Protocol=SCkTCPPrOtOCol'以TCP方式进行通信'设置效劳器通信程序的端口号,这里笔者使用的端口是8080Winsockl.LocalPort=Val(portText.Text)WinsockLListen'等待客户端连接请求'状态栏显不提不文字StatusBarl.SimpleText="效劳器已工作,准备接受请求"EndSub"客户端请求连接"事件代码:PrivateSubWinsock1ConnectionRcquest(ByValrequestIDAsLong)'如果当前连接是翻开的,那么关闭IfWinsockl.StateO0ThenWinsockl.CloseEndIfWinsockl.AcceptrequestID'接受客户请求StatusBarl.SimplcText="有客户请求,建立连接°"EndSubPriVatCSubDirl_Change()FileLPattern=("*.*")FileLPath=Dirl.PathEndSubPrivateSubDrive!Change()Dirl.Path=Drivel.DriveEndSubPrivateSubfilel_Click()1.abe12.Caption="你选择的是:*&Dirl.List(-1)&*&Filel.filenamefilepath=Filel.filenamefilelength=FileLen(Dirl.List(-1)&""&Filel.filename)EndSub运行效果如图3所示:图3效劳器端断点续传的运行效果客户端主程序OptionBase1DimflagAsBoolean'设置开关Dimfi1enameAsString,filelengthAsLong'存储文件信息Dimdata()AsByte,receivedAsLong'声明数据缓冲区和已接收的数据'初始化开关PrivateSubFormLoad()flag=TrueEndSub"连接"按钮事件的代码:PrivateSubconnectClick()Winsockl.Protocol=sckTCPProtocol'以TCP方式进行通信'设置远程效劳器IP地址,为方便调试笔者使用的是自身的IP地址Winsockl.RemoteHost=hostText.Text'设置远程效劳器通信程序端口号,与效劳器端相同Winsockl.RemotePort=Val(portText.Text)Winsockl.connect,与效劳器端建立连接EndSub"数据到达"事件的代码:PrivateSubWinsocklDataArrival(ByValbytesTotalAsLong)StatusBarl.SimplcText="正在接收效劳器的数据"Ifflag=TrueThen'分别接收传输文件的文件名、文件长度Winsockl.GetDatafilename,vbString,bytesTotal-4Winsockl.GetDatafilelength,vbLong'为传输文件设置临时文件tempfile=filename+td"'返回己接收的数据Open“d:"+filenameForBinaryAs#1OpentempfileForBinaryAs#2IfLOF(2)>OThenInput#2,receivedWinsockl.SendDatareceivedEndIfClose#2flag二FalseElseOpentempfileForOutputAs#2'建立数据缓冲区ReDimdata(bytesTotal)'接收效劳器端传输的数据Winsockl.GetDatadata,vbArray+vbByte'将接收的数据写入文件Eorj=received+1Toreceived+bytesTotalPut#1,j,data(j-received-1)Next'更新已接收的数据received=received+bytesTotal'更新临时文件Write#2,receivedProgressBarl.Value=Int(received/filelength)*100)传输完毕IfProgressBarl.Value>=100ThenStatusBarl.SimpleText="数据传输完毕!"Close#2'删除临时文件Kill(tempfile)Close#1EndIfClose#2EndIfEndSub运行效果如图4所示:图4客户端断点续传的效果4、总结整个设计到目前为止己根本完成,从选择这个设计课题开始,对WinSoCk控件一无所知到现在能够独立完本钱次设计,从中获益非浅。在设计中碰到了很多所未预料的棘手的难题,通过图书馆查阅资料,上网搜索相关知识以及通过VBQQ群里的朋友的帮助,逐个逐个的解决难题。同时,对自己程序设计的思维和问题解决能力也是一个很大的提高。本课题设计了基于VB的网络数据传输的C/S模型以及控制端和受控端模型。其中Winsock控件、文件夹的传输、添加客户端,是设计的重点和难点。每个模块都通过了屡次的实验和测试。木文通过在VB中使用WinSoCk控件,实现网络之间的文件传输,更进一步理解了其工作原理。此外,还研究在网络传输文件中要注意的问题,并对怎样处理传输文件比拟大时的情况进行了详细的分析,并通过实际的方法实现了文件的"断点续传",可以满足实际中的要求,其设计的思想也具有普遍的通用性通过此次的毕业设计,从另一个角度加深了自己的编程和软件开发的能力.首先,对设计的需求和功能设计要有全局的了解和掌握。在初次拿到这个课题时对WinSoCk控件作了一番了解,简单实现了字符的通信;在此根底上设计本课题需要实现的功能模块。在实际编程过程中,对于客户端的断开再连接实现操作一直是个难题,同时深层次的文件夹传输也困扰了许久。在本次设计中所遇到的一些难点,都是由自己寻求各种途径和方案最终将其解决,在编程和设计思路上有了新的提升。参考文献1崔彦锋,许小荣VB网络与远程控制编程实例教程M.北京:北京希望电子出版社,1996.34652卞志强.VisualBaSiC网络程序设计M.北京:人民邮电出版社,1993.48933肖斌,董磊.VisualBasic6网络编程实例教程M北京:北京希望电子出版社,1998.471394LorenEidahl.VisualBaSiC控件设计与开发M.浙江:浙江科学技术出版社,1998.26895魏江江.VisualBasicAPl编程百例通M.北京:科学出版社,2001.45786离春艳,刘彬彬.VisualBaSiC空件大全M.北京:人民邮电出版社,1991.1531

    注意事项

    本文(基于TCP的文件传输实验报告.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开