文件传输协议的简单设计与实现.docx
- 文档编号:3864751
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:25
- 大小:24.80KB
文件传输协议的简单设计与实现.docx
《文件传输协议的简单设计与实现.docx》由会员分享,可在线阅读,更多相关《文件传输协议的简单设计与实现.docx(25页珍藏版)》请在冰豆网上搜索。
文件传输协议的简单设计与实现
文件传输协议的简单设计与实现
摘要:
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
本设计是用JAVA语言简单实现文件传输协议,利用SOCKET以及SERVERSOCKE等类方法,当中实现了上传、下载、获取服务器目录等基本文件传输功能。
关键字:
文件传输、FTP。
1具体设计任务
1(1实验内容
我们的计算机网络实验环境建立在TCP/IP网络体系结构之上。
各计算机除了安装
TCP/IP软件外,还安装了TCP/IP开发系统。
实验室各计算机具备Windows环境中套接
字socket的编程接口功能,可为用户提供全网范围的进程通信功能。
本实验要求学生利
用这些功能,设计和实现一个简单的文件传送协议。
1(2具体要求
用socket编程接口编写两个程序,分别为客户程序(client.c)和服务器程序
(server.c),该程序应能实现下述命令功能:
get:
取远方的一个文件
put:
传给远方一个文件
pwd:
显示远主当前目录
dir:
列出远方当前目录
cd:
改变远方当前目录
:
显示你提供的命令
quit:
退出返回
此命令的具体工作方式(指给出结果的形式)可以参照FTP的相应命令,有余力的
同学可以多实现几个命令。
2基本思路及所涉及的相关理论
2.1文件传输协议
网络协议是网络中计算机与终端之间正确传送信息和数据的规范格式,起包括语法、
语义和时序这三部分。
文件传输协议(FileTransferProtocol,FTP)是在TCP/IP网
络中传输文件的一种格式规范,其规定在用户和服务器之间开设两个通信端口:
控制端口和数据端口。
前者生存周期为从用户登录开始直至用户登出,后者则在进行数据传送的时候打开,并且在数据传送完毕之后立即结束。
控制端口用来监听双方共同规定的控制字以达到及时提供服务或响应,数据端口则要先将文件拆分成分组再进行传送,这样做的目的是为了更加好的适应网络中的带宽限制,以及减少传送期间节点的延时,以达到高速传送。
2.2基本思路:
2.2.1模拟FTP的工作模式,在双方工作的时候开设两个端口,作为控制端口(2332)
和数据端口(2326)。
2.2.2规范控制字如下:
LIST:
获得服务器目录
LOGIN:
登陆
GET:
下载
PUT:
上传
QUIT:
登出
对应服务器响应返回控制字:
555:
发送列表完毕
444:
登录成功
000:
登陆失败
666:
下载结束
888:
服务器关闭
2.2.3模拟FTP工作机制,确定数据端口传送数据时,进行分组传送。
2.2.4服务器从打开开始,保持监听控制端口,当用户登陆成功后,主动分配该用
户服务线程。
2.2.5在传送数据的时候,为了确保不影响原程序的工作,应独立分配线程。
3方案设计(主要网络设备、网络拓扑结构设计图)
本设计基本设计图如下:
控制字传输
客户端服务器
数据传输
4网络具体配置步骤
4.1服务器:
4.1.1服务器界面:
JPaneljp1=newJPanel(),jp2=newJPanel(),jp3=newJPanel();
JButtonjb=newJButton("开始"),jb2=newJButton("end"),
jb3=newJButton("del"),jb4=newJButton("浏览");
staticJTextAreajt=newJTextArea();
booleanbool=true;
JSplitPanejsp=newJSplitPane();
JSplitPanejsp1=newJSplitPane(JSplitPane.VERTICAL_SPLIT);
staticJScrollPanejsc=newJScrollPane();
JPaneljp=newJPanel();
staticStringnewpath=null;
staticDefaultMutableTreeNoderoot;
staticJTreetree;
Stringname;
Stringipaddress;//实例化一些界面控件
ftpserver(){
super("服务器");//新建一个继承frame类的窗口
this.setSize(600,500);//设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(jsp);//添加JSplitPane面板
jsp.setDividerLocation((int)(this.getWidth()*0.28));
jsp.setLeftComponent(jsc);//设置JSplitPane面板左边的内容
jsp.setRightComponent(jsp1);//设置JSplitPane面板右边的内容
jsp1.setDividerLocation((int)(this.getHeight()*0.4));
jsp1.setTopComponent(jt);
jsp1.setRightComponent(jp);
jb.addActionListener(this);
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);//为按扭添加监听
jp.add(jb);
jp.add(jb2);
jp.add(jb3);
jp.add(jb4);//在面板中添加按扭
jsc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jsc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//设置滚动条方式
Toolkitkit=Toolkit.getDefaultToolkit();
DimensionscreenSize=kit.getScreenSize();//获得屏幕窗口大小
DimensionframeSize=this.getSize();//获得当前程序窗口大小
if(frameSize.height>screenSize.height){
frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width){
frameSize.width=screenSize.width;
}
this.setLocation((screenSize.width-frameSize.width)/2,
(screenSize.height-frameSize.height)/2);//窗口居中算法
this.setVisible(true);//设置窗口可见
4.1.2本地目录获得:
if(ob.equals(jb4)){//“浏览”按扭的响应事件
try{
JFileChooserjf=newJFileChooser();//打开一个文件选择窗口
jf.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//设置选择文件模式
intreturnval=jf.showOpenDialog(this);
Filechfile=jf.getSelectedFile();//获得所选择的文件
newpath=chfile.getAbsolutePath();//获得所选文件的路径
if(returnval==JFileChooser.APPROVE_OPTION){//“打开”按钮的响应事件
flush();//调用flush函数
}
else{
JOptionPane.showMessageDialog(this,"没有选择文件");
}
}catch(Exceptionee){
}
}
//flush函数
protectedvoidflush(){
DefaultMutableTreeNodedd=newDefaultMutableTreeNode(newpath);
tree=newJTree(dd);//新建一个结点为dd的树构造
setTree(dd,newpath);//调用setTree函数
jsc.getViewport().setView(tree);//将生成的树插入滚动条中
tree.expandRow(0);//展开根结点
his);tree.addTreeSelectionListener(t//为树结点添加选择响应监听
}
//setTree函数
privatestaticvoidsetTree(DefaultMutableTreeNoderoot2,Stringpath){
Filefile=newFile(path);
String[]fname=file.list();//获path路径下的目录和文件名
for(intj=0;j DefaultMutableTreeNoded=newDefaultMutableTreeNode(fname[j]); root2.add(d); }else{//是目录则添加目录 DefaultMutableTreeNoded=newDefaultMutableTreeNode(fname[j]); root2.add(d); setTree(d,f.getAbsolutePath());//递归生成目录下的内容} } } 4.1.3监听端口线程: privatevoidwork(){ try{ socket=listenport.accept();//监听端口 is=socket.getInputStream();br=newBufferedReader(newInputStreamReader(is));//建立输入流的数据缓冲 os=socket.getOutputStream();ps=newPrintStream(os);newThread(newRunnable(){//启动线程 publicvoidrun(){ try{ while(socket! =null){Stringfrist=br.readLine();//读取客户端发送的控制字if(frist.startsWith("222")){//客户端登陆请求 ipaddress=socket.getInetAddress().getHostAddress();//获取客户端IPStringstring=frist.substring(4);back=check(string);//调用check函数进行用户身份验证if(back==444){ ps.println("444");//通知客户端验证成功 }else{ ps.println("000");//通知客户端验证失败 } } if(frist.startsWith("list")){//客户端获取服务器列表请求List(1,newpath); ps.println("555Listcomplete! ! "); } if(frist.startsWith("get")){//客户端下载请求Stringname=frist.substring(frist.indexOf("/")+1).trim(); get(name); } if(frist.startsWith("put")){//客户端上传请求Stringname=frist.substring(4).trim(); put(name); } if(frist.equals("Quit")){//客户端退出通知 jt.setText((i--)+"个用户在线! ! "); bool=false; jt.append('\n'+"断开连接"); } } }catch(Exceptione){} } }).start(); }catch(Exceptione){e.printStackTrace(); } } 4.1.4用户请求目录列表响应: if(frist.startsWith("list")){//客户端获取服务器列表请求List(1,newpath);//调用List函数响应列表请求 ps.println("555Listcomplete! ! ");//通知客户列表发送结束} //List函数 privatevoidList(intb,Stringpath)throwsException{ Filefile=newFile(path); file.mkdirs(); String[]fname=file.list();//获取path路径下的目录和文件名 try{ Socketdata=newSocket(ipaddress,2326);//建立Socket套接字 OutputStreamos_data=data.getOutputStream();//建立数据缓冲 PrintStreamps_data=newPrintStream(os_data);prin(b,file,ps_data,fname);//调用prin函数 ps_data.flush(); ps_data.close(); os_data.close(); data.close();//释放系统资源 }catch(IOExceptione){ e.printStackTrace(); } } //prin函数 privatevoidprin(intb,Filefile,PrintStreamps_data,String[]fname){ //TODOAuto-generatedmethodstub for(intt=0;t if(file2.isDirectory()){//文件夹 StringisDirectory="-"; intc=b+1; ps_data.println(b+"|"+isDirectory+"|"+fname[t]); prin(c,file2,ps_data,file2.list());//递归发送文件夹下的内容 }else{//文件 Stringisfile="+"; ps_data.println(b+"|"+isfile+"|"+fname[t]);} } } 4.1.5下载响应: if(frist.startsWith("get")){//客户端下载请求 Stringname=frist.substring(frist.indexOf("/")+1).trim();//获得客户请求下载的文件名 get(name);//调用get函数 } //get函数 protectedvoidget(finalStringname){newThread(newRunnable(){//响应下载线程 publicvoidrun(){ //TODOAuto-generatedmethodstubFilefile=newFile(newpath+"\\"+name);//得到文件所在路径intcount; if(file.isFile()){//文件 try{ Socketdata=newSocket(ipaddress,2326);//建立Socket套接字OutputStreamos_data=data.getOutputStream(); RandomAccessFilesendfile=newRandomAccessFile(file.getAbsolutePath(), "r"); byte[]bytebuffer=newbyte[1024];//文件数据分组 while((count=sendfile.read(bytebuffer))! =-1){ os_data.write(bytebuffer,0,count);//传送数据 } os_data.flush(); os_data.close(); sendfile.close(); data.close(); ps.println("666getfilecomplete! ! ");//传送完成,释放相应资源并通知客户}catch(Exceptione){ e.printStackTrace(); } }else{ file.delete(); } } }).start(); } 4.1.6上传响应: if(frist.startsWith("put")){//客户端上传请求 Stringname=frist.substring(4).trim();//获得上传的文件的文件名put(name);//调用put函数 } //put函数 protectedvoidput(finalStringname){newThread(newRunnable(){//响应上传的线程 publicvoidrun(){ //TODOAuto-generatedmethodstubintcount; byte[]bytebuffer=newbyte[1024];//建立数据缓冲 try{ Socketdatasocket=dataport.accept();//监听数据 InputStreamis_data=datasocket.getInputStream(); RandomAccessFileaccfile=newRandomAccessFile(createfile().getAbsolutePath()+"\\"+name,"rw"); while((count=is_data.read(bytebuffer))! =-1){ accfile.write(bytebuffer,0,count);//接收数据并写入本地文件} accfile.close(); is_data.close(); datasocket.close(); ps.println("777sendfilecomplete! ! ");//文件接收完成,关闭相应资源并通知客户 }catch(FileNotFoundExceptione){e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }).start(); } 4.1.7登录响应: if(frist.startsWith("222")){//客户端登陆请求 ipaddress=socket.getInetAddress().getHostAddress();//获取客户端IPStringstring=frist.substring(4);back=check(string);//调用check函数进行用户身份验证 if(back==444){ ps.println("444");//通知客户端验证成功 }else{ ps.println("000");//通知客户端验证失败 } } //check函数 protectedintcheck(Stringstring){try{ Filef=newFile("."); FileReaderfr=new FileReader(f.getAbsolutePath().substring(0,f.getAbsolutePath().indexOf(". "))+"Login.dat");//读取当前目录下的用户文件Login.datBufferedReaderbb=newBufferedReader(fr); Stringcheck=bb.readLine(); while(! string.equals(check)&&check! =null){//比较用户名和口令check=bb.readLine(); } if(string.equals(check)){//验证成功 i++; jt.setText("-------"+i+"个用户在线! ! ");//显示用户数 return444;//返回444,开始准备数据传输; } return001;//验证失败 }catch(Exceptione){ jt.setText("000error"); return001; } } 4.2客户端: 4.2.1客户端界面: publicclassftpframeextendsJFrameimplementsActionListener{ GridBagLayoutgbl=newGridBagLayout();//采用网格布局方式GridBagConstraintsgbc=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件传输 协议 简单 设计 实现