2.4.1 TCP客户端与服务器端传输文件
题目要求
(1)分别创建名为UploadTCPServer 服务器端程序和 UploadTCPClient 客户端程序。 (2)编写服务器端程序 UploadTCPServer,要求实现: 1 创建 Socket 对象,连接当前服务器的 IP地址和端口号 10001。 2 调用 accept()方法持续接收客户端请求 3 针对每一个客户端请求创建一个线程进行连接管理, 4 在run()函数里处理客户端请求产进行上传文件保存 5 创建图片上传保存目录为D:\upload\目录下 6 通过客户端输入流读取上传图片写入到指定目录里的 7 服务器端向客户端做出相应,返回“上传成功”信息的 8 关闭流和Socket 连接 (3)编写客户端程序 UploadTCPClient,要求实现: 1 创建 Socket 对象,连接到指定的服务器端 2 通过输出流向服务器上传文件,并显示“显示到服务器端,开始文 件上传!” 3 图片上传完成后,关闭客户端输出流 4 客户端接收服务器端的相应信息“上传成功“并输出 3 关闭流和 Socket 连接 (4)在桌面新建的一个文件夹中,文件夹命名为“准考证号+考位号+2.4",请将 UploadTCPServer 和 UploadTCPClient 文件储存在此文件夹
编码
服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadTCPServer {
// 编写服务器端程序 UploadTCPServer,要求实现:
public static void main(String[] args) {
// 1、创建 Socket 对象,连接当前服务器的 IP地址和端口号 10001。
try {
ServerSocket serverSocket = new ServerSocket(10001);
while (true) {
// ServerSocket.accept返回的是socket类型的
// ServerSocket理解为中心?
// 2、调用 accept()方法持续接收客户端请求
Socket socket = serverSocket.accept();
// 3、针对每一个客户端请求创建一个线程进行连接管理
new Thread(new ClientHandler(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 新创的线程类
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
// 4、在run()函数里处理客户端请求产进行上传文件保存
@Override
public void run() {
try {
// 5、创建图片上传保存目录为D:\\upload\目录下
File directory = new File("D:\\upload");
if (!directory.exists()) {
// mkdirs()方法会创建所有不存在的父文件夹,如果父文件夹已经存在,就不会再创建了。
// mkdir()方法只会创建指定的文件夹,如果父文件夹不存在,就会抛出异常。
directory.mkdirs();
}
// 6、通过客户端输入流读取上传图片写入到指定目录里
InputStream inputStream = socket.getInputStream(); // 客户端输入流
FileOutputStream fileOutputStream = new FileOutputStream("D:\\upload\\bird.jpg"); // 具体题目中指定目录
// 缓冲区,用于临时存储从输入流中读取的数据
byte[] bytes = new byte[1024];
int byteRead; // 当前缓冲区读取到的长度
// 从socket客户端输入流中循环读取
while ((byteRead = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, byteRead);
}
// 关闭输出
fileOutputStream.close();
// 7、服务器端向客户端做出相应,返回“上传成功”信息的
OutputStream outputStream = socket.getOutputStream();
outputStream.write("上传成功".getBytes());
// 刷进去socket里的流中
outputStream.flush();
// 8、关闭流和Socket连接
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
客户端:
import java.io.*;
import java.net.Socket;
public class UploadTCPClient {
public static void main(String[] args) {
// 编写客户端程序 UploadTCPClient,要求实现:
try {
// 1、创建Socket对象,连接到指定的服务器端
Socket socket = new Socket("localhost", 10001);
// 2、通过输出流向服务器上传文件,并显示“显示到服务器端,开始文件上传!”
System.out.println("连接到服务器端,开始文件上传");
File file = new File("D:\\bird.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
// 获取socket的输出,将文件发送到服务器
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int byteRead = 0;
while ((byteRead = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, byteRead);
}
// 3、图片上传完成后,关闭客户端输出流
// 数据发送完毕,通知服务器已经结束文件传输
socket.shutdownOutput();
fileInputStream.close();
// 4、客户端接收服务器端的响应信息“上传成功“并输出
InputStrea