文件传输协议的简单设计与实现
摘要:
文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是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文件传输协议
网络协议是网络中计算机与终端之间正确传送信息和数据的规范格式,起包括语法、语义和时序这三部分。文件传输协议(File Transfer Protocol, 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服务器界面:
JPanel jp1 = new JPanel(), jp2 = new JPanel(), jp3 = new JPanel();
JButton jb = new JButton("开始"), jb2 = new JButton("end"),
jb3 = new JButton("del"),jb4 = new JButton("浏览");
static JTextArea jt = new JTextArea();
boolean bool = true;
JSplitPane jsp = new JSplitPane();
JSplitPane jsp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
static JScrollPane jsc = new JScrollPane();
JPanel jp = new JPanel();
static String newpath = null;
static DefaultMutableTreeNode root;
static JTree tree;
String name;
String ipaddress;//实例化一些界面控件
ftpserver() {
super("服务器");//新建一个继承frame类的窗口
this.setSize(600, 500);//设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jsp.setDividerLocation((int) (Width() * 0.28));
jsp.setLeftComponent(jsc);//设置JSplitPane面板左边的内容
jsp.setRightComponent(jsp1); //设置JSplitPane面板右边的内容
jsp1.setDividerLocation((int) (Height() * 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); //设置滚动条方式
Toolkit kit = DefaultToolkit();
Dimension screenSize = ScreenSize();//获得屏幕窗口大小
Dimension frameSize = Size();//获得当前程序窗口大小
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{
JFileChooser jf=new JFileChooser();//打开一个文件选择窗口
jf.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//设置选择文件模式int returnval = jf.showOpenDialog(this);
File chfile = jf.getSelectedFile();//获得所选择的文件
newpath = AbsolutePath();//获得所选文件的路径
if(returnval == JFileChooser.APPROVE_OPTION){//“打开”按钮的响应事件flush();//调用flush函数
}
else {
JOptionPane.showMessageDialog(this,"没有选择文件");
}
}catch(Exception ee){
}
}
//flush函数
protected void flush() {
DefaultMutableTreeNode dd = new DefaultMutableTreeNode(newpath);
tree = new JTree(dd);//新建一个结点为dd的树构造
setTree(dd, newpath);//调用setTree函数
tree.addTreeSelectionListener(this);//为树结点添加选择响应监听
}
//setTree函数
private static void setTree(DefaultMutableTreeNode root2, String path) { File file = new File(path);
String[] fname = file.list();//获path路径下的目录和文件名
for (int j = 0; j < fname.length; j++) {
File f = new AbsolutePath()+"\\"+fname[j]);
if (f.isFile()) {//是文件则添加文件
DefaultMutableTreeNode d = new DefaultMutableTreeNode(fname[j]);
root2.add(d);
} else {//是目录则添加目录
DefaultMutableTreeNode d = new DefaultMutableTreeNode(fname[j]);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。