《文件传输协议的简单设计与实现40061.docx》由会员分享,可在线阅读,更多相关《文件传输协议的简单设计与实现40061.docx(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课 程 设设 计 课程名称 计算算机网络课课程设计 题目名称 文件传输输协议的简简单设计与与实现 学生学院 专业班级_ _ 学 号 学生姓名_ _指导教师_ _ 2010 年 1 月 5 日设计摘要关键词:SSOCKEET编程,FFTPcllientt/serrver程程序摘要:本课课程设计包包含了文件件传输协议议的简单设设计与实现现。文件传送是是各种计算算机网络实实现的基本本功能,文文件传送协协议是一种种最基本的的应用层协协议按照客客户/服务务器的模式式进行工作作,提供交交互式的访访问,是IINTERRNET使使用最广泛泛的协议之之一。文件件传输协议议的简单设设计与实现现建立在计计算机网络络
2、实验环境境TCP/IP 网网络体系结结构之上,使使用soccket 编程接口口编写两个个程序,分分别为客户户程序(ccliennt.c)和服务器器程序(sserveer.c),实现下下述命令功功能:get , put, pwd, dir, cd, ?, quiit 等,利利用了已有有网络环境境设计并实实现简单应应用层协议议。本设计包括括了具体设设计任务,基基本思路及及所涉及的的相关理论论,设计流流程图,调调试过程中中出现的问问题及相应应解决办法法,实验运运行结果,核核心程序,个个人体会及及建议等。目录1、文件传传输协议的的简单设计计与实现-181. 1 具体设计计任务-181.2 基基本思路及
3、及所涉及的的相关理论论-181.2.11基本思路路-182.2.22 相关理理论-181.3设计计流程图-1191.4实验验运行情况况-1991.5 核核心程序-22 22.5.11 服务器器(sevver)程程序-222 22.5.22 客户(ccliennt)程序-291.6心得得体会-337参考文献-3382、文件传传输协议的的简单设计计与实现2. 1 具体设计计任务计算机网络络实验环境境建立在TTCP/IIP 网络络体系结构构之上。各各计算机除除了安装TTCP/IIP 软件件外,还安安装了TCCP/IPP 开发系系统。实验验室各计算算机具备WWindoows环境境中套接字字sockke
4、t 的的编程接口口功能,可可为用户提提供全网范范围的进程程通信功能能。本实验验要求利用用这些功能能,设计和和实现一个个简单的文文件传送协协议。用sockket 编编程接口编编写两个程程序,分别别为客户程程序(cllientt.c)和和服务器程程序(seerverr.c),该该程序应能能实现下述述命令功能能:get:取取远方的一一个文件put:传传给远方一一个文件pwd:显显示远主当当前目录dir:列列出远方当当前目录cd :改改变远方当当前目录? :显示示你提供的的命令quit :退出返返回2.2基本本思路及所所涉及的相相关理论2.2.11基本思路路 设计程序使使客户端连连接的时候候,服务器器
5、将会向客客户端发回回一条消息息告知它的的IP地址址,然后关关闭连接并并继续接收收端口的连连接。建立立各个命令令功能对应应的函数,发发送请求,等待服务器端的服务。服务器端初始化WinSock,创建SOCKET,获取主机信息,并对客户端进行会话,发送回复讯息给客户端,响应完毕后关闭连接,释放WinSock。2.2.22 相关理理论 文件传送是是各种计算算机网络都都实现的基基本功能,文文件传送协协议是一种种最基本的的应用层协协议按照客客户/服务务器的模式式进行工作作,提供交交互式的访访问,是IINTERRNET使使用最广泛泛的协议之之一。计算机网络络实验环境境建立在TTCP/IIP 网络络体系结构构
6、之上。各各计算机除除了安装TTCP/IIP 软件件外,还安安装了TCCP/IPP 开发系系统。实验验室各计算算机具备WWindoows环境境中套接字字sockket 的的编程接口口功能,可可为用户提提供全网范范围的进程程通信功能能。本设计计利用这些些功能,设设计和实现现一个简单单的文件传传送协议。用用sockket 编编程接口编编写两个程程序,分别别为客户程程序(cllientt.c)和和服务器程程序(seerverr.c)。2.3 设设计流程图图2.4实验验运行情况况服务器端运运行,默认认自动启动动监听,情情况如下图图:服务如果关关闭监听,效效果如下图图:客服端运行行,如下图图:输入服务器器
7、端的IPP和端口号号进行连接接,效果如如图:下面设置文文件保存位位置,如图图:下面演示上上传一个视视频文件,然然后再下载载下来,其其中上传过过程的进度度信息:上传完成后后的效果图图:下载文件的的进度提示示信息:下载完成后后,指定目目录下就有有了该文件件了:2.5 核核心程序2.5.11 服务器器(serrver)程程序如下usingg Systtem;usingg Systtem.Colllectiions.Geneeric;usingg Systtem.Linqq;usingg Systtem.Textt;usingg Systtem.Threeadinng;usingg Systtem.N
8、et;usingg Systtem.Net.Sockkets;usingg Systtem.IO;usingg Systtem.Winddows.Formms;namesspacee TCP文文件传输_服务器 cclasss WorkkThreead bbyte buufferr; iint buffferSiize= 40966; TThreaad mythhreadd; SSockeet handdler; ppubliic WorkkThreead(Sockket workkSockket) hhandller = worrkSoccket; bbuffeer = new byteebu
9、ffferSiize; mmythrread = neew Threead(BegiinCommmuniicatiion); ppubliic voidd Starrt() mmythrread.Starrt(); ppubliic voidd Aborrt() mmythrread.Aborrt(); pprivaate voidd BegiinCommmuniicatiion() wwhilee (truue)/从客客户端接收收数据,直直到连接断断开 ttry iint reCoount = haandleer.Receeive(bufffer); sstrinng insSStr =En
10、coodingg.BigEEndiaanUniicodee.GetSttringg(bufffer, 0, rreCouunt); iif (inssStr.Subsstrinng(0, 4) = namee)/收到到下文件请请求 sstrinng fileeNamee = innsStrr.Substtringg(5, insSStr.Lenggth - 5); SSendFFile(fileeNamee, hanndlerr); eelse if (inssStr.Subsstrinng(0, 4) = boott)/收到到获取根目目录请求 sstrinng listtStr = Geet
11、FilleNammes(F:, fallse); SSendSStrinng(handdler, lisstStrr); eelse if (inssStr.Subsstrinng(0, 4) = pathh)/收到到获取指定定目录内容容请求 sstrinng pathh = innsStrr.Subsstrinng(5, inssStr.Lenggth - 5); sstrinng listtStr = GeetFilleNammes(pathh, fallse); SSendSStrinng(handdler, lisstStrr); eelse if (inssStr.Subsstrin
12、ng(0, 4) = Queuu)/获取取下载文件件夹请求,回复完整整文件名列列表 sstrinng pathh = innsStrr.Subsstrinng(5, inssStr.Lenggth - 5); sstrinng listtStr = GeetFilleNammes(pathh, truue); SSendSStrinng(handdler, lisstStrr); eelse if (inssStr.Subsstrinng(0, 4) = upldd)/收到到上传文件件请求 sstrinng reFiileNaame = inssStr.Subsstrinng(5, inssS
13、tr.Lenggth - 5); LLoadFFile(reFiileNaame, handdler); eelse if (inssStr.Subsstrinng(0, 4) = quitt)/收到到断开连接接命令 HHostQQuit(); bbreakk; ccatchh HoostQuuit();breeak; pprivaate voidd LoaddFilee(striing reFiileNaame, Sockket handdler) ttry FFileSStreaam fs = new FileeStreeam(reFiileNaame, FileeModee.Creaat
14、e, FileeAcceess.Writte); hhandller.Receeive(bufffer, 8, SSockeetFlaags.Nonee);/接接收文件大大小 llong fileesizee = BiitConnvertter.ToInnt64(bufffer, 0); llong receeiveCCountt = 00; wwhilee (recceiveeCounnt fileesizee)/接收收文件 iint readdcounnt = handdler.Receeive(bufffer, buffferSiize, SockketFllags.Nonee); ff
15、s.Writte(bufffer, 0, rreadccountt); rreceiiveCoount += rreadccountt; ffs.Closse(); ccatchh HHostQQuit(); pprivaate voidd SenddFilee(striing fileeNmaee, Soccket handdler) ttry FFileSStreaam fs = new FileeStreeam(fileeNmaee, FilleModde.Openn, FilleAcccess.Readd); llong sizee = fss.Lenggth; bbyte byysi
16、zee = BiitConnvertter.GetBBytess(sizee); hhandller.Sendd(bysiize, 8, SSockeetFlaags.Nonee);/发发送文件大大小 BBinarryReaader br = new BinaaryReeaderr(fs); iint senddcounnt = 0; wwhilee (senndcouunt sizze)/发送送文件 iint readdcounnt = br.Readd(bufffer, 0, bbuffeerSizze); ssendccountt += readdcounnt; hhandller.Se
17、ndd(bufffer, readdcounnt, SoccketFFlagss.Nonee); ccatchh HHostQQuit(); pprivaate voidd HosttQuitt() GGlobaalVallues.canCContrrol.WaittOne(); GGlobaalVallues.canCContrrol.Releease(); iif (hanndlerr.Connnecteed = truue) hhandller.Shuttdownn(SockketShhutdoown.Bothh); hhandller.Closse(); pprivaate voidd
18、 SenddStriing(Sockket handdler,striing listtStr) bbyte liist = Enccodinng.BigEEndiaanUniicodee.GetBBytess(listtStr); bbyte liistcoountbbuffeer = BitCConveerterr.GetBBytess(Convvert.ToInnt64(listt.Lenggth); ttry hhandller.Sendd(listtcounntbufffer, 8, SockketFllags.Nonee);/发发送列表大大小 iint senddcounnt =
19、0; wwhilee (senndcouunt lisst.Lenggth)/发送送列表 iif (senndcouunt + buffferSSize liist.Lenggth)/不是是最后一次次 iint i = haandleer.Sendd(listt, senndcouunt, buffferSiize, SockketFllags.Nonee); ssendccountt += i; eelse iint i = haandleer.Sendd(listt, senndcouunt, listt.Lenggth - senndcouunt, SockketFllags.Nonee
20、);/发发送最后一一次 ssendccountt += i; ccatchh (Excceptiion e) MMessaageBoox.Showw(连接断断开.); /filleOnlly=trrue则获获取指定目目录及子目目录内所有有文件信息息,filleOnlly=faalse则则获取指定定目录文件件信息及文文件夹信息息 pprivaate striing GetFFileNNamess(striing pathh, boool fileeOnlyy) sstrinng listtStr = sttringg.Emptty; DDirecctoryyInfoo drctt = neew
21、DireectorryInffo(pathh); fforeaach (FileeSysttemInnfo fsi in drctt.GetFFileSSysteemInffos() iif (fsii is FileeInfoo) /文件 FFileIInfo fi = (FilleInffo)fsi; llistSStr += fii.FulllNamee; llistSStr += n; iif (fi.Lenggth 10224) sstrinng sizeeStr = fii.Lenggth.ToSttringg() + 字节节; llistSStr += siizeSttr; ee
22、lse if (fi.Lenggth 10224 * 10244) ddoublle tempp = Coonverrt.ToDooublee(fi.Lenggth) / 10024; sstrinng sizeeStr = sttringg.Formmat(0:F1, temmp) + KBB; llistSStr += siizeSttr; eelse if (fi.Lenggth 10224 * 10244 * 11024) ddoublle tempp = Coonverrt.ToDooublee(fi.Lenggth) / 10024 / 10224; sstrinng sizeeS
23、tr = sttringg.Formmat(0:F1, temmp) + MBB; llistSStr += siizeSttr; eelse ddoublle tempp = Coonverrt.ToDooublee(fi.Lenggth) / 10024 / 10224 / 10244; sstrinng sizeeStr = sttringg.Formmat(0:F1, temmp) + GBB; llistSStr += siizeSttr; llistSStr += n; llistSStr += fii.LasttWritteTimme.ToSttringg(yyyyy-MMM-d
24、d hh:mmm:sss); llistSStr += n; eelse if (fsii is DireectorryInffo) iif (filleOnlly) llistSStr += GeetFilleNammes(fsi.FulllNamee, truue); eelse /文件夹夹 DDirecctoryyInfoo di = (DirrectooryInnfo)fsi; llistSStr += dii.FulllNamee; llistSStr += n; llistSStr += ddir; llistSStr += n; llistSStr += dii.LasttWri
25、tteTimme.ToSttringg(yyyyy-MMM-dd hh:mmm:sss); llistSStr += n; rreturrn listtStr; publiic 服务器() InittialiizeCoomponnent(); Conttrol.ChecckForrIlleegalCCrosssThreeadCaalls = faalse; striing HosttNamee = Dnns.GetHHostNName(); /得到主主机名 IPHoostEnntry IpEnntry = Dnns.GetHHostEEntryy(HosttNamee); /得到主机机IP s
26、triing strIIPAdddr = IpEnntry.AddrressLList0.TToStrring(); tsTxxb_IPPAdd.Textt = sttrIPAAddr; hosttIPAdddresss = IPAdddresss.Parsse(strIIPAdddr); Servver = neww IPEnndPoiint(hosttIPAdddresss,Conveert.ToInnt32(tsTxxb_Poort.Textt); sockk = neew Sockket(AddrressFFamilly.InteerNettworkk, SockeetTyppe.St
27、reeam, ProttocollTypee.Tcp); sockk.Bindd(Servver); sockk.Listten(110); striing str = 正在在监听端口口 + tsTTxb_PPort.Textt + .; tsLbbl_Sttatuss.Textt = 状状态: + sttr; AcceeptThh = neew Threead(ThAccceptt); AcceeptThh.Starrt();/开始始监听端口口/下面是是监听和停停止监听的的按钮事件件privaate voidd btn_Starrt_Cllick(objeect sendder, Evenn
28、tArggs e) ttsBtnn_Staart.Enabbled = faalse; ttsBtnn_Stoop.Enabbled = trrue; SServeer = new IPEnndPoiint(hosttIPAdddresss, Connvertt.ToInnt32(tsTxxb_Poort.Textt); ssock = neew Sockket(AddrressFFamilly.InteerNettworkk, SoccketTType.Streeam, ProttocollTypee.Tcp); ssock.Bindd(Servver); ssock.Listten(110); sstrinng str = 正在在监听端口口 + tsTTxb_PPort.Textt + .; ttsLbll_Staatus.Textt = 状状态: + sttr; AAccepptTh = neew Threead(ThAccceptt); AAccepptTh.Starrt(); pprivaate voidd btn_stopp_Cliick(objeect sendder, EvenntArggs e) ttsBtnn_Staart.Enabbled = trrue; ttsBtnn_Stoop