文件传输协议的简单设计与实现Word格式.docx
- 文档编号:16770989
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:25
- 大小:24.80KB
文件传输协议的简单设计与实现Word格式.docx
《文件传输协议的简单设计与实现Word格式.docx》由会员分享,可在线阅读,更多相关《文件传输协议的简单设计与实现Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
语义和时序这三部分。
文件传输协议(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<
fname.length;
j++){Filef=newFile(file.getAbsolutePath()+"
\\"
+fname[j]);
if(f.isFile()){//是文件则添加文件
DefaultMutableTreeNoded=newDefaultMutableTreeNode(fname[j]);
root2.add(d);
}else{//是目录则添加目录
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(){
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{
000"
//通知客户端验证失败
if(frist.startsWith("
list"
)){//客户端获取服务器列表请求List(1,newpath);
555Listcomplete!
!
"
get"
)){//客户端下载请求Stringname=frist.substring(frist.indexOf("
/"
)+1).trim();
get(name);
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用户请求目录列表响应:
//调用List函数响应列表请求
//通知客户列表发送结束}
//List函数
privatevoidList(intb,Stringpath)throwsException{
file.mkdirs();
//获取path路径下的目录和文件名
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<
t++){Filefile2=newFile(file.getAbsolutePath()+"
+fname[t]);
if(file2.isDirectory()){//文件夹
StringisDirectory="
-"
;
intc=b+1;
ps_data.println(b+"
|"
+isDirectory+"
prin(c,file2,ps_data,file2.list());
//递归发送文件夹下的内容
}else{//文件
Stringisfile="
+"
+isfile+"
}
4.1.5下载响应:
)){//客户端下载请求
Stringname=frist.substring(frist.indexOf("
//获得客户请求下载的文件名
//调用get函数
//get函数
protectedvoidget(finalStringname){newThread(newRunnable(){//响应下载线程
//TODOAuto-generatedmethodstubFilefile=newFile(newpath+"
+name);
//得到文件所在路径intcount;
if(file.isFile()){//文件
//建立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();
sendfile.close();
666getfilecomplete!
//传送完成,释放相应资源并通知客户}catch(Exceptione){
}else{
file.delete();
4.1.6上传响应:
)){//客户端上传请求
Stringname=frist.substring(4).trim();
//获得上传的文件的文件名put(name);
//调用put函数
//put函数
protectedvoidput(finalStringname){newThread(newRunnable(){//响应上传的线程
//TODOAuto-generatedmethodstubintcount;
Socketdatasocket=dataport.accept();
//监听数据
InputStreamis_data=datasocket.getInputStream();
RandomAccessFileaccfile=newRandomAccessFile(createfile().getAbsolutePath()+"
+name,"
rw"
while((count=is_data.read(bytebuffer))!
accfile.write(bytebuffer,0,count);
//接收数据并写入本地文件}
accfile.close();
is_data.close();
datasocket.close();
777sendfilecomplete!
//文件接收完成,关闭相应资源并通知客户
}catch(FileNotFoundExceptione){e.printStackTrace();
4.1.7登录响应:
//调用check函数进行用户身份验证
if(back==444){
//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){
000error"
4.2客户端:
4.2.1客户端界面:
publicclassftpframeextendsJFrameimplementsActionListener{
GridBagLayoutgbl=newGridBagLayout();
//采用网格布局方式GridBagConstraintsgbc=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件传输 协议 简单 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)