一、 题目

实现客户端与服务器文件互传软件系统,包括客户端不仅可以浏览自己本地的文件列表和服务器的文件列表,而且客户端可以将本地的文件上传到服务器及将从服务器上下载自己需要的文件。

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_java

二、要求

1.系统要求必须支持将每个文件的元数据进行存储;
2.支持从服务器中获取文件的元数据;
3.能够支持用户名和密码的验证;
4.客户端和服务器必须具有上传和下载两种能力,并且为了确保上传和下载能够成功,要求先检查碰盘空间。

三、编程环境

操作系统:Windows10
编程语言:java “1.8.0_151”
IDE:eclipse

四、 文件传输协议(TCP)

建立连接:

服务端:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务器_02

客户端:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_java_03


发送方:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务端_04

接收方:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_客户端_05

说明:
发送方与接收方通过Socket建立TCP连接。
发送方通过FileInputStream流对象fis将对应文件中的数据以字节方式读取到byte数组bytes中,然后通过OutputStream对象os把bytes中的数据输出到客户端,最后通过Socket给接收方一个结束标记。
接收方通过InputStream流对象读取从客户端发来的数据并存到byte数组bytes中,然后通过FileOutputStream对象把bytes中数据写入到客户端的对应文件中。

五、 方案设计说明

1、文件上传设计基本思路:
客户端通过FileInputStream流对象把要上传的文件的内容以二进制流的方式读取到内存中,然后与服务器端通过socket建立TCP连接,再通过OutputStream对象中的方法write,把读取到的文件内容上传到服务器。
服务器通过InputStream流对象读取从客户端上传的数据再通过FileOutputStream对象把文件内容存在新建的与客户端上传文件同名文件中。
其中,客户端与服务器通过DataOutputStream与DataInputStream发送字符串等类型数据做一些交互(比如客户端给服务器发送要上传的文件名、或者退出文件上传功能进入其他功能)

2、文件下载设计思路:
基本与文件上传类似,只不过数据发送方和接受方反过来了。

3、对文件的元数据进行存储思路:
服务器通过DB.txt文件一行行存储 文件名 文件大小 上传时间。
每次服务器启动时通过BufferedReader流对象的readline方法一行行读取字符串并加到List对象DB中作为运行时的数据库。每次上传文件完成后服务器端通过File对象获取文件名和大小、通过Data对象获取当前时间然后通过拼接字符串组成一个String加入到DB中再把DB中的内容写回到DB.txt文件中。

4、从服务器获取文件元数据设计思路:
服务端通过DataOutputStream对象把DB中的字符串发给客户端客户端通过对应的对象接收到文件的元数据并打印出来。

5、用户名和密码的验证设计思路:
客户端通过提示输入用户名和密码然后通过DataOutputStream对象发给服务端,服务端通过对应对象接收到后验证并根据验证结果发送相应信息给客户端,客户端根据返回的信息判断下一步。

6、检查磁盘空间设计思路:
客户端、服务端通过File对象的getTotalSpace、getFreeSpace方法获得对应磁盘的总空间和剩余空间,服务端通过Dataoutputstream对象把数据发给客户端,客户端通过相应对象接收并打印。

六、 运行方式

项目目录:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务端_06


先运行服务端TCPserver.java再运行客户端TCPclient.java(用户名:zs 密码:123)。

D:\client文件夹作为客户端文件系统(其中D:\client\download\中存放从服务端下载下来的文件; D:\client\中存放要说上传给服务器的文件),D:\server文件夹作为服务端文件系统(其中D:\server\upload\存放从客户端上传的文件)

七、 运行结果

运行前:

服务端:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务器_07


客户端:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务端_08


运行:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_java_09


JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务器_10


运行后:

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_客户端_11

JAVA 服务器如何判断客户端上传完毕 java服务器上传文件_服务器_12

八、 问题及有待提高的地方

没有用多线程,只能一个服务端一个客户端。
	客户端退出系统后重新运行客户端会报错,需要重新运行服务端再运行服务端才行(应该是存在bug)。
	用户登录是写死的 用户名:zs、密码:123,可以通过mysql数据库弄注册之类的。
	文件元数据是通过DB.txt文本文件存的,可以用mysql数据库存。