版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计课程名称计算机网络题目名称文件传输协议的简单设计与实现学生学院自动化学院专业班级13级物联网工程1班学号3113001554学生姓名梁建斌指导教师刘洪涛2015年12月25日摘要文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问。本设计是基于Eclipse平台下使用Java实现的FTP文件传输。实现基本的文件传输操作。建立客户端和服务器、客户端基于TCPSocket进行数据传输,采用多线程进行数据传输,套接字来实现。在实现过程中采用类与对象的思想进行规划,体验了一个软件开发过程的具体实现步骤。关键字:Java网
2、络编程FTP文件传输文件上传下载文件操作目录、实验目的3二、实验内容和要求31、实验内容32、具体要求3三、实验主要仪器设备和材料3四、基本原理332.系统功能设计44基本功能44五、实现结构流程图5六、整体实现的逻辑、数据结构55FTPClient用户界面5FTPClient控制连接线程7FTPClient数据连接线程72.服务器的抽象数据类型82.1 FTPServer的控制连接线程8FTPServer的数据连接线程9七、具体的一些方法实现91. FTPClient用户界面102. FTPClient控制连接103. FTPClient数据传输124. FTPServer控制连接145.
3、FTPServer数据传输14八、测试结果客户端结果16服务端结果16九、课程设计心得17十、参考文献18一、实验目的文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和实现技巧。二、实验内容和要求1、实验内容我们的计算机网络实验环境建立在TCP/IP网络体系结构之上。各计算机除了安装TCP/IP软件外,还安装了TCP/IP开发系统。实验室各计算机具备Windows环境中套接
4、字socket的编程接口功能,可为用户提供全网范围的进程通信功能。本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。2、具体要求用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.。,该程序应能实现下述命令功能:get::取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd:改变远方当前目录?:显示你提供的命令quit:退出返回这此命令的具体工作方式(指给出结果的形式)可以参照FTP的相应命令,有余力的同学可以多实现几个命令。最后,写出实验报告。三、实验主要仪器设备和材料联网计算机四、基本原理FT
5、P是Internet上传文件的应用层协议。FTP规定数据包的格式、数据包头部结构和命令结构等等。FTP应用TCP传输而不用UDP。由FTP提供的文件传输将一个完整的文件从一个系统复杂然后通过TCP套接字发送传输个另一个系统中。一方为服务器。一方为客户端。FTP建立两个TCP连接,一个用于数据传输,一个用于传输命令。每一个FTP主机都有一个“协议解析器”模块。FTP以纯文本形式发送,其响应同样也是纯文本形式。在进行文件传输时,FTP的客户端和服务器之间要建立两个并行的TCP连接:“控制连接”和“数据连接”。控制连接在整个连接回话的期间一直保持打开状态。当FTP客户端通过控制连接发送请求,并告诉服
6、务器自己的数据连接的动态端口号(randomPort),服务器通过控制连接(2554)接收到请求信息,然后,创建数据连接(randomPort)进程进行连接客户端的数据传输端口。由于FTP采用两个不同的端口,所以数据连接和控制连接不会混乱。原理图看图12.系统功能设计基本功能:ClientServer界面设计;输入要连的远程主机服务器IP,上传任意格式的文件;下载任意格式文件(能实现断点续传);查看服务器的根目录;列出服务器当前文件夹目录,更改服务器当前文件夹目录再列出,支持多客户同时数据访问服务器(通过控制层给传输层分配动态端实现)。系统功能实现:FTPServer启动控制连接线程Serve
7、rControlPro创建一个ServerSocket端口号为2554进行实况监听访问。FTPClient开启,启动用户界面菜单,输入IP后,弹出选择提示菜单,用户输入想实现的操作operating(get,put,dir,pwd,-cd)和相应其它信息(文件路径),然后FTPClient开启控制连接的线程ClientControlPro访问FTPServer的2554端口进行控制连接,并启动了数据连接线程ClientTransPrd服务器接收到FTPClient的请求和相关信息,进行启动数据连接ServerTransPro,监听客户端的数据连接。完成相应请求后。服务器关闭套接字,关闭数据连接
8、线程。进入监听状态。五、实现结构流程图六、整体实现的逻辑、数据结构ADTClient(数据对象:控制线程数据传输线程数据关系:控制线程控制数据传输线程三个类:ClassUserinterface;用户界面ClassClientControlPro;控制进程ClassClientDataTransPro;/数据传输进程)FTPClient用户界面ADTClient-Userinterface()publicstaticvoidmain(Stringargs)(System.out.println("请输入服务器ip地址");serverIP=input.next();opti
9、onmenu();)staticvoidoptionmenu()(System.out.println("欢迎来到FTP文件管理客户端");System.out.println("");)");System.out.println("请输入具体操作(hgetputdirpwd-cdquitStringoperating=input.next();try(switch(operating)(case"h":System.out.println("使用说明书!n");showUsingBook();
10、break;case"get":/获取要下载的文件名StringgetFileNmae=getFileName();Stringa=getFileNmae.split(".",2);houzui=a1;System.out.println("下载中");newClientControlPro(operating,getFileNmae,serverIP,houzui).start();/控制连接break;case"put":StringputFileNmae=putFileName();System.out.pr
11、intln("发送中");newClientControlPro(operating,putFileNmae,serverIP,houzui).start();break;case"dir":System.out.println("开始操作列出远方当前目录功能!");newClientControlPro(operating,"",serverIP,houzui).start();break;case"pwd":System.out.println("开始操作显示远主当前路径功能!&q
12、uot;);newClientControlPro(operating,"",serverIP,houzui).start();break;case"-cd":System.out.println("开始操作改变远方当前目录文件功能!");/获取要更改文件的新路径StringcdFileDirName=getChangeDir();newClientControlPro(operating,cdFileDirName,serverIP,houzui).start();break;case"quit":System.
13、out.println("正在退出程序!");System.exit(0);break;default:break;optionmenu();catch(Exceptione1)e1.printStackTrace();System.out.println("客户端启动失败!");)FTPClient控制连接线程publicclassClientControlProextendsThread(StringuserCode=""/传输给服务器的一窜控制信息Stringoperating;StringgetFilename;Strings
14、erverIP;Stringhouzui;longposition;intrandomPort;publicClientControlPro(Stringoperating,StringgetFilename,StringserverIP,Stringhouzui)publicvoidrun()randomPort=newRandom().nextInt(65535);/生成随机端口userCode=operating+":"+randomPort+":"+":"+position+":"+getFilename;
15、/利用":"通过正则表达式拆分3个字符窜sendMessage();/发送控制信息并启动传输端线程sendMessage()FTPClient数据连接线程ClientTransProextendedThreadpublicClientTransPro(Stringoperating,StringgetFilename,StringserverIP,Stringhouzui,intrandomPort,longposition).publicvoidrun()switch(operating)case"get":download();break;case&
16、quot;put":upload(getFilename);break;case"pwd":show();break;case"dir":dir();break;case"-cd":dir();break;default:break;)2.服务器的抽象数据类型ADTServer数据对象:控制线程Socket(2554)数据传线程Socket(randomPort)数据关系:控制线程控制数据传输线程三个类:ServerInterface服务器入口ServerControlPro/控制进程ServerDataTransPro/数
17、据传输进程)2.1 FTPServer的控制连接publicclassServerControlProextendsThreadpublicvoidrun()ServerSocketserverSocket;serverSocket=newServerSocket(2554);/学号后三位加+2000while(true)System.out.println("监听到客户端请求第"+i+"个!n");/控制线程Sockets=serverSocket.accept();/创建一个监听客户请求的套接字i+;getClientMessage(s);/接收客户
18、端传来的控制信息并启动传输端线程)getClientMessage(s).;)FTPServer的数据连接publicclassServerDataTransProextendsThreadStringoperatingStringgetFilenameStringrandomPortSocketsocket;=,;;,;;,;;intserverRandomPort;StringgetFilename)publicServerDataTransPro(Stringoperating,StringrandomPort,(this.operating=operating;this.getFile
19、name=getFilename;this.randomPort=randomPort;nullpublicvoidrun()ServerSocketserverSocket=try(serverRandomPort=newInteger(randomPort);serverSocket=newServerSocket(serverRandomPort);booleanisflag=true;while(isflag)(socket=serverSocket.accept();输端"连接本服务数据传System.out.println("有客户端"+socket.
20、toString()+);if(socket!=null)(switch(operating)(case"get":System.out.println(download();isflag=false;break;case"put":System.out.println(put(socket);isflag=false;break;case"pwd":System.out.println(pwd();isflag=false;break;case"dir":System.out.println(dir();isfl
21、ag=false;"控制端的操作是get")"控制端的操作是put")"控制端的操作是pwd")"控制端的操作是dir")break;case"-cd":System.out.println("控制端的操作是-cd");cd();isflag=false;break;default:break;isflag=false;serverSocket.close();catch(IOExceptione)e.printStackTrace();七、具体的一些方法实现1.FTPCli
22、ent控制连接的sendMessage()方法,访问服务器的2554端口,发送控制指令和指令信息给服务器的控制连接线程,并启动了自己的传输线程。privatevoidsendMessage()/发送信息给服务器控制端ClientTransProctp=newClientTransPro(operating,getFilename,serverIP,houzui,randomPort,position);Socketsocket;trysocket=newSocket(serverIP,2554);OutputStreamosToSer=socket.getOutputStream();Inpu
23、tStreamisFromSer=socket.getInputStream();osToSer.write(userCode.getBytes();osToSer.close();isFromSer.close();socket.close();ctp.start();catch(UnknownHostExceptione)10e.printStackTrace();catch(lOExceptione)(e.printStackTrace();2.FTPClient数据传输各操作方法实现privatevoiddir()/列出文件夹目录(try(randomPortSocketsocket=
24、newSocket(serverIP,randomPort);/动态端口lnputStreaminputStream=socket.getlnputStream();/缓存接收数据,然后进行显示服务器的路径:byterecvbuf=newbyte1024;intlen;while(len=inputStream.read(recvbuf)!=-1)(len=inputStream.read(recvbuf);Stringstr=newString(recvbuf);Stringdir=str.split(",");for(inti=0;i<dir.length;i+)
25、(System.out.println(diri);inputStream.close();socket.close();catch(IOExceptione)(e.printStackTrace();publicvoiddownload()(/下载文件操作/先进套接字访问服务器数据传输线程:Socketsocket;try(11socket=newSocket(serverIP,randomPort);/建立输入输出流进行数据通信:Inputstreaminputstream=socket.getInputStream();RandomAccessFilefile_out=newRandom
26、AccessFile("downloadfile."+houzui,"rw");/创建从中读取和向其中写入(可选)的随机访问文件流intpos=(int)position;file_out.seek(pos);/即定位到要开始下载的字节位置bytebytes=newbyte10240;while(c=inputStream.read(bytes)!=-1)file_out.write(bytes,0,c);/关闭流和套接字file_out.close();inputStream.close();catch(UnknownHostExceptione1)e
27、1.printStackTrace();catch(IOExceptione1)e1.printStackTrace();publicvoidupload(Stringfilename)try/*上传文件操作先进套接字访问服务器数据传输线程和输入输出流的实现:*/Socketsocket=newSocket(serverIP,randomPort);InputStreaminputStream=socket.getInputStream();/根据用户选择的文件路径进行读取本地文件到缓存中然后发送给服务器的数据传输线程。具体如下:Filefile_in=newFile(filename);Fi
28、leInputStreamfis=newFileInputStream(file_in);bytebytes=newbyte1024;while(c=fis.read(bytes)!=-1)outputStream.write(bytes,0,c);fis.close();inputStream.close();12socket.close();catch(lOExceptione)(e.printStackTrace();/显示服务器的路径publicvoidshow()(try(Socketsocket=newSocket(serverlP,randomPort);lnputStreami
29、nputStream=socket.getlnputStream();/缓存接收数据,然后进行显示服务器的路径:byterecvbuf=newbyte1024;intlen;while(len=inputStream.read(recvbuf)!=-1)(len=inputStream.read(recvbuf);System.out.println(newString(recvbuf);inputStream.close();socket.close();catch(lOExceptione)(e.printStackTrace();类各方法的实现privatevoidgetClientMe
30、ssage(Sockets)/接收客户端控制线程发来的控制信息(lnputStreamis=s.getlnputStream();byteb=newbyte1024;intc;StringBuffersb=null;Stringstr=null;while(c=is.read(b)!=-1)(str=newString(b);sb=newStringBuffer(str);String口a=sb.toString().split(":",4);/根据给定正则表达式的匹配拆分成四个字符串13Stringoperating=a0;StringrandomPort=a1;Stri
31、ngposition=a2;Stringfile=a3.trim();s.close();newServerDataTransPro(operating,randomPort,file,position).start();/传参给传输端,启动传输端线程。4.FTPServer数据传输类各方法的实现privatevoidcd()/发送指定路径的目录tryStringsendDir=""StringBuffersb=newStringBuffer();Stringstr;Filefs=newFile(getFilename).listFiles();if(fs=null)|(f
32、s.length<=0)sendDir="空文件夹";elsefor(inti=0;i<fs.length;i+)if(fsi.isDirectory()str="目录:"+fsi.getName()+sb=newStringBuffer(sb+str);sendDir=sb.toString();OutputStreamos=socket.getOutputStream();bytebytes=newbyte1024;bytes=sendDir.getBytes();os.write(bytes);os.close();socket.clo
33、se();catch(FileNotFoundExceptione)e.printStackTrace();catch(IOExceptione)14e.printStackTrace();privatevoiddir()/发送服务器当前文件夹目录名称(try(StringsendDir=""StringBuffersb=newStringBuffer();Stringstr=""Stringstring=System.getProperty("user.dir");/得到当前文件夹路径System.out.println(strin
34、g);File口fs=newFile(string).listFiles();if(fs=null)|(fs.length<=0)(sendDir="空文件夹";else(for(inti=0;i<fs.length;i+)if(fsi.isDirectory()(str="目录:"+fsi.getName()+","sb=newStringBuffer(sb+str);sendDir=sb.toString();/"目录:.settings,目录:bin,目录:src,"OutputStreamos=
35、socket.getOutputStream();bytebytes=newbyte1024;bytes=sendDir.getBytes();os.write(bytes);os.close();socket.close();catch(FileNotFoundExceptione)(e.printStackTrace();catch(IOExceptione)(e.printStackTrace();15privatevoidpwd()/发送当前文件夹绝对路径(StringworkingDir=System.getProperty("user.dir");Outputs
36、treamos;try(System.out.println(getFilename);os=socket.getOutputStream();bytebytes=newbyte1024;bytes=workingDir.getBytes();os.write(bytes);os.close();socket.close();catch(FileNotFoundExceptione)(e.printStackTrace();catch(IOExceptione)(e.printStackTrace();privatevoidput(Socketsocket)/接收客户端发来的文件(try(In
37、putStreaminputStream=socket.getInputStream();Stringstr=getFilename.split(".",2);/得到发来的文件的后缀,能收到任意格式的文件Stringhouzui=str1;Filefile_out=newFile("receivefile."+houzui);FileOutputStreamos=newFileOutputStream(file_out);bytebytes=newbyte1024;intc;while(c=inputStream.read(bytes)!=-1)(os.
38、write(bytes,0,c);/关闭流和套接字os.close();inputStream.close();socket.close();16catch(Exceptione)(e.printStackTrace();privatevoiddownload()/发送客户端要下载的文件(/建立输入输出流进行数据通信:Filefile_in=newFile(getFilename);OutputStreamos;intc;try(Stringstr=file_in.toString();System.out.println("file_in"+str);RandomAcce
39、ssFilerandomAccessFile=newRandomAccessFile(file_in,"rw");os=socket.getOutputStream();/读客户端发来的文件断点位置intpos=Integer.parseInt(position);/把客户端传来的的position变整型randomAccessFile.seek(pos);/即定位到要开始下载的字节位置bytebytes=newbyte10024;while(c=randomAccessFile.read(bytes)!=-1)(os.write(bytes,0,c);.八、测试结果客户端
40、结果:17Us&rlnterfaceJawaApphcaticnC:PrograimFiIe-sl3vaXjdkl7075binjavaw.exe(2015-12-25请输入服杳器工口地址01款迎柒至用TP文件管理百户端清输入旦体播作chgetputdi.rpwd-cdquit)dir升帕操作到出西方筠前目录功能!欢迎来到FTP文印管理容白端i者输入具悻操作<hgetputdirpwd-cdquit)目录:.5e七七;n月3目录:bin目录r针upwd并始揍作显示也主与前路径功能!欧迎亲到匚TP文件管理客户端i音输力且体操作Chgetpvtdirpwd-cd
41、quit)CtUs.prsAdministratorworkspiicFTPSprver-cd开始操作双芟运方当前目录文件功能!清施久里曲登的的9件路径:F;*|r”I请输入要改兖的的文件路径:一欢来到FTP文件苣理客户端i吉输入具悻掾IFWhgetputdirpwdquitj目录:5360Stc±1on目录逐RECYCLE.BIM日就C女日录;360Downloads目录二4己小也目录:GGHQ目录步白停目录:GouWoGame'S目录:KanKn目录:Ku<jOU、前1:KiifiauTarha目录:KwDonlodd日录士M三Qc:"9H目录:MSOCa
42、che目录:NBA2K14.DrcamTools.tool.vl_3目录:ppsfile目录;PldeleFiles目录!iqyiIjI即I18get清输入要下载的文件路径:f-Aavi.rmvb下载中欢迎来到FTP文件管理客户端清施A具体操作(hgetputdirpwd-cdquit)dir开始操作列出远方当前目录功能(欢迎来到FTP文件管睥客户端请输X具体操作(hgetputdirpwd-cdquit)目录;.settings目录:bin目录:bULfFT注意此时get(下载)还没结束,后马上dir也能访问说明动态端口实现了同时访问功能。服务器结果:ervenntEiEce.JavaApp
43、iiration|wr5grarr,rIesJava'jdkl.V_j5;t)in'javaw.eie卜/n!",:上牌第器已后研监陪电三楠东篥部!喇国客户蜀前涌好!Socketaddr=/192.16B.1.101Jport=62251JlocaLportT11335$:MiS控触解蚓N是dirC:UsersAdmmstpatorworkspaceFTPSenver撷谈喀内荷第梯2个!«MlfcSD<ket3ddr=/192.16S.l.101,port=62262,locaLport=37499jSJ:ig肺擀蝇F是pwd品噫匿H滞请术第升
44、7;msocket3ddr=/192.lbE.1.101,上296,1。仁君port二5上157隹层江W再颤将看航端附金粕痛乍是rd盥谈喀用荷爸辟*H他同行txketaddp=/192.108.1,181,popt=E2568/OS1口cpt=4邸2遑擅树踢附昨输蓝控艇轴潴作是号江fi1e_in干:'电臬-rnwh猿噫厝井前翻第5个119控制端的操作是g3tf£lc_inf:avi.rmvb监听到看户端请求第5个!有客户端55。七£”=/192.168.1,101川。广七=6257%工口alp。七=3霞72连接本版转数据传输端¥谛麟的鞋作是diC:User
45、sAdminis'tratorwarkspaceFTPServerd注意此时新启动一个客户端连接put文件而上一个get下载操作还没完成说明动态端口实现了同时访问请制A版号器LP地卅192,168.1.101欢迎*手肝丁町性笆理客户潮i青餐j入同f本操作thputdirpwd-cdquit3put:请辆人要发送的史件解包J卜*电星汽上rmvb发送中-欢i卬未至"FTP文件曾洱客户端济瑜具体据作Chputdirpwd-cdquit)addr/lO2.IGB.1.101,port&2'SEBT1ecfl1pcrt_4I3H2iZE>5TJIHS5fkiH主制事需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江苏省建筑安全员B证考试题库附答案
- 贵州财经职业学院《生殖医学》2023-2024学年第一学期期末试卷
- 贵阳职业技术学院《编排与版式》2023-2024学年第一学期期末试卷
- 2025年贵州建筑安全员《A证》考试题库及答案
- 2025年陕西建筑安全员《B证》考试题库
- 2025年天津建筑安全员《B证》考试题库
- 广州中医药大学《管理沟通双语》2023-2024学年第一学期期末试卷
- 2025江苏省安全员《B证》考试题库
- 广州医科大学《机械制造技术课程设计》2023-2024学年第一学期期末试卷
- 2025贵州建筑安全员-B证考试题库附答案
- 新版【处置卡图集】施工类各岗位应急处置卡(20页)
- ABB断路器参数调试讲义
- 管廊维护与运营绩效考核评分表
- 钢制三通加工工艺流程介绍
- 阳宅形法及峦头
- 移交涉密载体签收单(模板)
- 机动车检测站内部管理制度.doc
- 尾矿库施工组织设计
- 投标文件封标用封面、密封条11
- 300MW火电厂水汽氢电导率超标的原因及处理方法
- 国际文凭组织IBO简介
评论
0/150
提交评论