一、简介
前几节课学习了TCP套接字(socket),能实现字符串的发送和接收功能,简单地做到了客户机和服务器的对话。我们继续学习TCP套接字,利用它的字节传输技术, 实现网络文件传输 。
网络文件传输中用两个TCP端口来实现:
- 一个端口用来对话,传递控制信息,总是开启
- 一个端口实现 文件数据传递服务 ,有数据传输服务时开启
网络对话和网络文件传输,使用TCP的socket编程,本质还是一样,对话过程,使用字符流来包装;而网络文件传输过程,则应该使用字节流来进行处理。
基于C/S的主要程序结构如下:
客户端发送对话信息给2021服务器,服务器接收对话信息,并回话。客户端向2020服务器发送文件名,服务器接收数据文件。
客户端程序:
- 主界面客户端程序FileClientFX.java;
- 文件对话客户端程序(控制进程)FileDialogClient.java;
- 文件数据客户端程序(数据传输进程)FileDataClient.java。
服务端程序:
- 文件对话服务器程序FileDialogServer.java,开启2021端口(身份验证、文件目录传送)
- 文件数据服务器程序FileDataServer.java,开启2020端口(传送文件名,接收文件)
二、创建客户端远程文件对话程序(FileDialogClient.java)
主要功能:发送用户信息、实现和文件服务器的基本对话,文件浏览和下载
客户端发生信息后,所收到的信息与交互,和服务端的程序编写有关,客户端无法控制。
其中:
- 发送 dir 显示文件列表
- 发送 help 显示帮助信息
- bye表示退出
- 发送文件名,服务器会回馈文件名是否正确、能否下载
- 根据提示使用“下载”按钮完成下载动作
三、创建客户端数据传送进程(FileDataClient.java)
主要功能:连接服务器数据端口、发送文件名、保存下载的文件,文件传输完成后关闭数据连接。
该程序有2个方法:
- 构造方法,FileDataClient(String ip, String port),向服务器的数据端口请求连接
- 文件下载方法,getFile(fileName)
1、构造方法代码
// 构造方法代码:向服务器数据端口请求连接
FileDataClient(String ip, String port) throws IOException {
try {
dataSocket = new Socket(ip, Integer.parseInt(port));
} catch (Exception e) {
e.printStackTrace();
}
}
2、文件下载方法
public void getFile(File saveFile) throws IOException {
if (dataSocket != null) { // dataSocket是Socket类型的成员变量
FileOutputStream fileOut = new FileOutputStream(saveFile);//新建本地空文件
byte[] buf = new byte[1024]; // 用来缓存接收的字节数据
//网络字节输入流
InputStream socketIn = dataSocket.getInputStream();
//网络字节输出流
OutputStream socketOut = dataSocket.getOutputStream();
//(2)向服务器发送请求的文件名,字符串读写功能
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socketOut, "utf-8"), true);
pw.println(saveFile.getName());
//(3)接收服务器的数据文件,字节读写功能
int size = 0;
while ((size = socketIn.read(buf)) != -1) {//读一块到缓存,读取结束返回-1
fileOut.write(buf, 0, size); //写一块到文件
}
fileOut.flush();//关闭前将缓存的数据全部推出
//文件传输完毕,关闭流
fileOut.close();
if (dataSocket != null) {
dataSocket.close();
}
} else {
System.err.println("连接ftp数据服务器失败");
}
}
四、实验过程
- 启动客户端FileClientFX.java程序,连接xxx.xxx.xxx.xx : xxxx服务器,关注提示信息,根据提示信息操作;
- 根据信息显示区的文件列表,在信息输入区输入要下载文件的全名(如果实现了扩展练习要求的快捷功能,可以使用鼠标拖动加亮式),使用“发送”按钮发送此文件名,服务器会给出相应反馈提示信息;
- 在信息输入区输入要下载文件的全名(如果实现了扩展练习要求的快捷功能,可以使用鼠标拖动加亮方式),点击“下载”按钮从服务器下载文件
- 运行下载的jar文件(双击,或控制台使用java -jar 文件名),运行成功。由于我的idea不是2018版,使用java -jar文件名运行。