基于TCP&UDP的网络文件服务
1 实验目的****
-
掌握Java Socket,TCP,UDP编程的基本概念和方法;
-
掌握Java I/O的基本操作;
-
掌握Java多线程编程。
2 实验内容****
-
复习Java I/O和Socket编程相关概念和方法;
-
基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient;
-
服务器端启动时需传递root目录参数,并校验该目录是否有效;
-
服务器启动后,开启TCP:2021端口,UDP:2020端口,其中,TCP连接负责与用户交互,UDP负责传送文件;
-
客户端启动后,连接指定服务器的TCP 2021端口,成功后,服务器端回复信息:“客户端IP地址:客户端端口号>连接成功”;
-
连接成功后,用户可通过客户端命令行执行以下命令:
**[1] ********ls 服务器返回当前目录文件列表(<file/dir> name size)
**[2] ********cd ********< **dir **> ********进入指定目录(需判断目录是否存在,并给出提示)
********[3] **********get ********通过UDP下载指定文件,保存到客户端当前目录下
********[4] ********bye 断开连接,客户端运行完毕
- 服务器端支持多用户并发访问,不用考虑文件过大或UDP传输不可靠的问题。
3 运行示例****
server端:
Client端:
提示:
-
通过TCP连接时,服务器端需保存用户当前所在目录的信息(初始连接时为服务器指定的根目录),通过cd .. 可退到上一级目录,但当前目录为根目录时,不做变动。
-
TCP连接时,客户端可能一次接收多行数据,需循环从输入流中读取,服务器端可在每次输出结束时多输出一个空行,客户端根据空行来判断每次输入的结束。
-
get命令的执行:可先发送给TCP连接,判断get后的参数在当前目录下是否为普通文件,若不是,回复提示信息,若是,回复客户端特定信息(如OK),以及该文件的物理路径和大小,客户端接收到OK后,紧接着读取后续的信息,再通过UDP请求该文件。
-
UDP传输文件时,需将文件分次读取到byte[]缓存中,每次封装一个DatagramPacket,依次发送给客户端,为了确保发送的顺序,可在每次发送结束时通过:
TimeUnit.MICROSECONDS.sleep(1);
来限制发送的速度;客户端接收时,循环接收DatagramPacket,循环次数为文件大小/缓存大小 + 1。
4 实验仪器、设备****
1) PC机最低配置:2G Hz以上CPU;1G以上内存;1G以上硬盘空间;
2) JDK 1.6或以上版本;
3) Eclipse 4.2或以上版本。
5 实验要求****
1) 按实验内容完成整个程序,并将你写的所有源代码和说明文档打包命名为:学号_姓名.rar 提交至 ftp://10.13.0.10/课件/ ICARNEGIE_SSD8_网络与分布计算/实验提交 目录下;
2) 代码应符合Java编程规范和添加必要的注释。
6 评分标准****
1、类的设计、JAVA代码规范、JAVADOC、类、方法、变量命名规范。 10分
2、服务器TCP输入读取、命令基本处理、错误命令、参数处理。 10分
3、服务器TCP多线程编程、线程池的使用。 20分
4、正确处理ls命令,返回当前目录文件信息,注意中文字符的显示是否正确。 10分
5、正确处理get命令,通过TCP回复客户端信息中包含文件的物理路径和大小。文件传输采用UDP方式,循环缓冲读取文件发送多个数据包给客户端。20分。
6、正确处理cd命令,返回当前目录,根目录之外不处理。 10分
7、正确处理bye命令,关闭连接。10分
8、服务器、客户端正确接收运行参数,没有采用硬编码的方式设置服务器地址、服务器根目录。10分