一、项目描述
文件上传下载应用程序
二、功能分析
1、服务器端实现了多线程技术;
2、客户端可以向服务器上传所有格式的文件;
3、客户端可以获取服务器上的文件列表;
4、服务器上的文件列表使用Jlist组件显示;
5、客户端可以从获取到的列表中选择文件名,并下载到本地文件夹内;
三、程序设计
1、项目中包含两个包,一个Server包,一个Client包;
2、Server包中包含三个文件:TestServer.java、ServerFrame.java和ServerThread.java;
3、Client包中包含四个文件:TestClient.java、ClientFrame.java、 DownLoadThread.java 和UpLoadThread.java;
4、 服务器和客户端的主类分别是TestServer.java 和TestClient.java
5、 ServerFrame.java文件中
ServerFrame类继承Jframe类:构建服务器界面;
BackgroundJTextArea类继承JtextArea类:创建有背景图案的textArea;
6、 ServerThread.java文件中
(1) ServerThread类 实现了Runnable接口,定义了socket、数据输入输出流和显示文本域,在run函数中使用if-else结构来判定从客户端发来的命令,并执行sendFileList()、sendToClient()和getFileFromClient()三种命令;
(2)sendFileList():服务器向客户端发送文件列表
sendToClient():服务器向客户端发送文件;
getFileFromClient():服务器从客户端获取文件
7、 ClientFrame.java文件中
(1)、ClientFrame类 继承Jframe类:构建客户端界面;
(2)、定义一个Jlist:用来显示文件列表,处于BorderLayout布局的南部;
三个Jbutton:用来接收上传、下载和获取文件列表三种命令;
(当进行上传操作时,添加JfileChooser组件用来在本地系统中选择目标文件;)
一个J TextField:用来显示所操作的文件名,设置为不可编辑;
(3)、编写public void actionPerformed(ActionEvent e)方法,该方法实现了对按钮单击事件的监听功能,
8、 DownLoadThread.java文件实现了对服务器中文件的下载,与Server中的sendToClient()方法对应。
实现了Runnable接口,在重写run()方法中:
第一步接收Server通过Socket传来的文件名,接收文件长度;
第二步创建一个新文件定义数据输入输出流;
第三步将Socket中的字符循环写入新建的文件中,完成后关闭写入流并执行JOptionPane.showMessageDialog(null, "文件下载成功")显示弹框。
注:ServerThread中的sendToClient()方法与之类似;
9、 UpLoadThread.java文件实现了对所选文件的上传,与Server中的getFileFromClient()方法对应。
实现了Runnable接口,在重写run()方法中:
第一步从界面获取到的文件名传给Server,向Server传入文件长度;
第二步将文件按字节传到数据流中,通过Socket端口传给Server;
第三步文件读完后,关闭读入流,弹框如上。
注:ServerThread中的getFileFromClient()方法与之类似;
四、测试
程序运行结果如图:
目前程序设计达到功能设计的要求。
Bug:上传“图片或word文档”过程中有很小的几率出现文件残缺的现象,不稳定。