ftp文件传输协议课程设计报告大学毕业设计论文.docx
《ftp文件传输协议课程设计报告大学毕业设计论文.docx》由会员分享,可在线阅读,更多相关《ftp文件传输协议课程设计报告大学毕业设计论文.docx(26页珍藏版)》请在冰豆网上搜索。
![ftp文件传输协议课程设计报告大学毕业设计论文.docx](https://file1.bdocx.com/fileroot1/2023-1/8/041c418c-6a3d-45ee-9f15-a035befa76c0/041c418c-6a3d-45ee-9f15-a035befa76c01.gif)
ftp文件传输协议课程设计报告大学毕业设计论文
课程设计
课程名称_计算机网络
题目名称_文件传输协议的简单设计与实现
学生学院_自动化学院
专业班级_13级物联网工程1班
学号_3113001554
学生姓名梁建斌
指导教师刘洪涛
2015年12月25日
摘要
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问。
本设计是基于Eclipse平台下使用Java实现的FTP文件传输。
实现基本的文件传输操作。
建立客户端和服务器、客户端基于TCPSocket进行数据传输,采用多线程进行数据传输,套接字来实现。
在实现过程中采用类与对象的思想进行规划,体验了一个软件开发过程的具体实现步骤。
关键字:
Java网络编程FTP文件传输文件上传下载文件操作
目录
一、实验目的3
二、实验内容和要求3
1、实验内容3
2、具体要求3
三、实验主要仪器设备和材料3
四、基本原理3
1.FTP系统模型3
2.系统功能设计4
2.1总体设计4
基本功能4
2.2系统实现4
五、实现结构流程图5
六、整体实现的逻辑、数据结构
6
1.客户端的抽象数据类型6
1.1FTPClient用户界面6
1.2FTPClient控制连接线程7
1.3FTPClient数据连接线程7
2.服务器的抽象数据类型8
2.1FTPServer的控制连接线程8
2.2FTPServer的数据连接线程9
七、具体的一些方法实现
9
1.FTPClient用户界面10
2.FTPClient控制连接10
3.FTPClient数据传输12
4.FTPServer控制连接14
5.FTPServer数据传输14
八、测试结果
客户端结果...............................................................................................................................................................16
服务端结果16
九、课程设计心得17
十、参考文献18
一、实验目的
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和实现技巧。
二、实验内容和要求
1、实验内容
我们的计算机网络实验环境建立在TCP/IP网络体系结构之上。
各计算机除了安装TCP/IP软件外,还安装了TCP/IP开发系统。
实验室各计算机具备Windows环境中套接字socket的编程接口功能,可为用户提供全网范围的进程通信功能。
本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。
2、具体要求
用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:
get:
取远方的一个文件
put:
传给远方一个文件
pwd:
显示远主当前目录
dir:
列出远方当前目录
cd:
改变远方当前目录
?
:
显示你提供的命令
quit:
退出返回
这此命令的具体工作方式(指给出结果的形式)可以参照FTP的相应命令,有余力的同学可以多实现几个命令。
最后,写出实验报告。
三、实验主要仪器设备和材料
联网计算机EclipseJDK1.7帮助文档
四、基本原理
1.FTP系统模型
FTP是Internet上传文件的应用层协议。
FTP规定数据包的格式、数据包头部结构和命令结构等等。
FTP应用TCP传输而不用UDP。
由FTP提供的文件传输将一个完整的文件从一个系统复杂然后通过TCP套接字发送传输个另一个系统中。
一方为服务器。
一方为客户端。
FTP建立两个TCP连接,一个用于数据传输,一个用于传输命令。
每一个FTP主机都有一个“协议解析器”模块。
FTP以纯文本形式发送,其响应同样也是纯文本形式。
在进行文件传输时,FTP的客户端和服务器之间要建立两个并行的TCP连接:
“控制连接”和“数据连接”。
控制连接在整个连接回话的期间一直保持打开状态。
当FTP客户端通过控制连接发送请求,并告诉服务器自己的数据连接的动态端口号(randomPort),服务器通过控制连接(2554)接收到请求信息,然后,创建数据连接(randomPort)进程进行连接客户端的数据传输端口。
由于FTP采用两个不同的端口,所以数据连接和控制连接不会混乱。
原理图看图1
FTP采用两个TCP进行连接
图1
2.系统功能设计
2.1总体设计
基本功能:
ClientServer界面设计;输入要连的远程主机服务器IP,上传任意格式的文件;下载任意格式文件(能实现断点续传);查看服务器的根目录;列出服务器当前文件夹目录,更改服务器当前文件夹目录再列出,
支持多客户同时数据访问服务器(通过控制层给传输层分配动态端口实现)。
2.2系统实现
系统功能实现:
FTPServer启动控制连接线程ServerControlPro创建一个ServerSocket端口号为2554进行实况监听访问。
FTPClient开启,启动用户界面菜单,输入IP后,弹出选择提示菜单,用户输入想实现的操作operating(get,put,dir,pwd,-cd)和相应其它信息(文件路径),然后FTPClient开启控制连接的线程ClientControlPro访问FTPServer的2554端口进行控制连接,并启动了数据连接线程ClientTransPro。
服务器接收到FTPClient的请求和相关信息,进行启动数据连接ServerTransPro,监听客户端的数据连接。
完成相应请求后。
服务器关闭套接字,关闭数据连接线程。
进入监听状态。
5、实现结构流程图
六、整体实现的逻辑、数据结构
1.客户端的抽象数据类型
ADTClient
{
数据对象:
控制线程数据传输线程
数据关系:
控制线程控制数据传输线程
三个类:
ClassUserInterface;//用户界面
ClassClientControlPro;//控制进程
ClassClientDataTransPro;//数据传输进程
}
1.1FTPClient用户界面
ADTClient-UserInterface()
{
publicstaticvoidmain(String[]args)
{
System.out.println("请输入服务器ip地址");
serverIP=input.next();
optionmenu();
}
staticvoidoptionmenu()
{
System.out.println("欢迎来到FTP文件管理客户端");
System.out.println("-------------------------------");
System.out.println("请输入具体操作(hgetputdirpwd-cdquit)");
Stringoperating=input.next();
try
{
switch(operating)
{
case"h":
System.out.println("使用说明书!
\n");
showUsingBook();
break;
case"get":
//获取要下载的文件名
StringgetFileNmae=getFileName();
String[]a=getFileNmae.split("\\.",2);
houzui=a[1];
System.out.println("下载中---------");
newClientControlPro(operating,getFileNmae,serverIP,houzui).start();//控制连接
break;
case"put":
StringputFileNmae=putFileName();
System.out.println("发送中----------");
newClientControlPro(operating,putFileNmae,serverIP,houzui).start();
break;
case"dir":
System.out.println("开始操作列出远方当前目录功能!
");
newClientControlPro(operating,"",serverIP,houzui).start();
break;
case"pwd":
System.out.println("开始操作显示远主当前路径功能!
");
newClientControlPro(operating,"",serverIP,houzui).start();
break;
case"-cd":
System.out.println("开始操作改变远方当前目录文件功能!
");
//获取要更改文件的新路径
StringcdFileDirName=getChangeDir();
newClientControlPro(operating,cdFileDirName,serverIP,houzui).start();
break;
case"quit":
System.out.println("正在退出程序!
");
System.exit(0);
break;
default:
break;
}
}optionmenu();
catch(Exceptione1)
{
e1.printStackTrace();
System.out.println("客户端启动失败!
");
}
}
1.2FTPClient控制连接线程
publicclassClientControlProextendsThread
{
StringuserCode="";//传输给服务器的一窜控制信息
Stringoperating;
StringgetFilename;
StringserverIP;
Stringhouzui;
longposition;
intrandomPort;
publicClientControlPro(Stringoperating,StringgetFilename,StringserverIP,Stringhouzui){...}
publicvoidrun()
{
randomPort=newRandom().nextInt(65535);//生成随机端口
userCode=operating+":
"+randomPort+":
"+":
"+position+":
"+getFilename;//利用":
"通过正则表达式拆分3个字符窜
sendMessage();//发送控制信息并启动传输端线程
}
sendMessage(){...}
}
1.3FTPClient数据连接线程
ClientTransProextendedThread{
...
publicClientTransPro(Stringoperating,StringgetFilename,StringserverIP,
Stringhouzui,intrandomPort,longposition)
{...}
publicvoidrun()
{
switch(operating)
{
case"get":
download();
break;
case"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//数据传输进程
}
2.1FTPServer的控制连接
publicclassServerControlProextendsThread{
......
publicvoidrun()
{
ServerSocketserverSocket;
serverSocket=newServerSocket(2554);//学号后三位加+2000
while(true)
{
System.out.println("监听到客户端请求第"+i+"个!
\n");
//控制线程
Sockets=serverSocket.accept();//创建一个监听客户请求的套接字
i++;
getClientMessage(s);//接收客户端传来的控制信息并启动传输端线程
}
getClientMessage(s){...};
}
2.2FTPServer的数据连接
publicclassServerDataTransProextendsThread
{
Stringoperating="";
StringgetFilename="";
StringrandomPort="";
Socketsocket;
intserverRandomPort;
publicServerDataTransPro(Stringoperating,StringrandomPort,StringgetFilename)
{
this.operating=operating;
this.getFilename=getFilename;
this.randomPort=randomPort;
}
publicvoidrun()
{
ServerSocketserverSocket=null;
try
{
serverRandomPort=newInteger(randomPort);
serverSocket=newServerSocket(serverRandomPort);
booleanisflag=true;
while(isflag)
{
socket=serverSocket.accept();
System.out.println("有客户端"+socket.toString()+"连接本服务数据传输端");
if(socket!
=null)
{
switch(operating)
{
case"get":
System.out.println("控制端的操作是get");
download();
isflag=false;
break;
case"put":
System.out.println("控制端的操作是put");
put(socket);
isflag=false;
break;
case"pwd":
System.out.println("控制端的操作是pwd");
pwd();
isflag=false;
break;
case"dir":
System.out.println("控制端的操作是dir");
dir();
isflag=false;
break;
case"-cd":
System.out.println("控制端的操作是-cd");
cd();
isflag=false;
break;
default:
break;
}
}
isflag=false;
}
serverSocket.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
七、具体的一些方法实现
1.FTPClient控制连接的sendMessage()方法,访问服务器的2554端口,发送控制指令和指令信息给服务器的控制连接线程,并启动了自己的传输线程。
privatevoidsendMessage()//发送信息给服务器控制端
{
ClientTransProctp=newClientTransPro(operating,getFilename,serverIP,houzui,randomPort,position);
Socketsocket;
try
{
socket=newSocket(serverIP,2554);
OutputStreamosToSer=socket.getOutputStream();
InputStreamisFromSer=socket.getInputStream();
osToSer.write(userCode.getBytes());
osToSer.close();
isFromSer.close();
socket.close();
ctp.start();
}catch(UnknownHostExceptione)
{
e.printStackTrace();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
2.FTPClient数据传输各操作方法实现
privatevoiddir()//列出文件夹目录
{
try
{
Socketsocket=newSocket(serverIP,randomPort);//动态端口randomPort
InputStreaminputStream=socket.getInputStream();
//缓存接收数据,然后进行显示服务器的路径:
byte[]recvbuf=newbyte[1024];
intlen;
while((len=inputStream.read(recvbuf))!
=-1)
{
len=inputStream.read(recvbuf);
}
Stringstr=newString(recvbuf);
String[]dir=str.split(",");
for(inti=0;i
{
System.out.println(dir[i]);
}
inputStream.close();
socket.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
publicvoiddownload()
{
//下载文件操作
//先进套接字访问服务器数据传输线程:
Socketsocket;
try
{
socket=newSocket(serverIP,randomPort);
//建立输入输出流进行数据通信:
InputStreaminputStream=socket.getInputStream();
RandomAccessFilefile_out=newRandomAccessFile("downloadfile."+houzui,"rw");//创建从中读取和向其中写入(可选)的随机访问文件流
intpos=(int)position;
file_out.seek(pos);//即定位到要开始下载的字节位置
byte[]bytes=newbyte[10240];
while((c=inputStream.read(bytes))!
=-1)
{
file_out.write(bytes,0,c);
}
//关闭流和套接字
file_out.close();
inputStream.close();
}catch(UnknownHostExceptione1)
{
e1.printStackTrace();
}catch(IOExceptione1)
{
e1.printStackTrace();
}
}
publicvoidupload(Stringfilename)
{
try
{
/*
*上传文件操作先进套接字访问服务器数据传输线程和输入输出流的实现:
*/
Socketsocket=newSocket(serverIP,randomPort);
InputStreaminputStream=