Java Socket 监听端口传输文件
概述
Java提供了Socket
类用于网络通信,利用Socket
类可以实现网络上的进程之间通信。在网络通信中,常常需要通过监听端口来传输文件。本文将介绍如何使用Java Socket监听端口传输文件,并提供相应的代码示例。
代码示例
下面是使用Java Socket监听端口传输文件的代码示例:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888); // 创建服务器端Socket对象
System.out.println("服务器已启动,等待客户端连接...");
Socket socket = serverSocket.accept(); // 监听客户端连接
System.out.println("客户端已连接");
DataInputStream dis = new DataInputStream(socket.getInputStream()); // 获取输入流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); // 获取输出流
String fileName = dis.readUTF(); // 读取文件名
long fileSize = dis.readLong(); // 读取文件大小
System.out.println("开始接收文件:" + fileName);
FileOutputStream fos = new FileOutputStream(fileName); // 创建文件输出流
byte[] bytes = new byte[1024];
int length;
while ((length = dis.read(bytes, 0, bytes.length)) != -1) { // 从输入流中读取数据并写入文件
fos.write(bytes, 0, length);
fos.flush();
}
System.out.println("文件接收完成");
dos.writeUTF("文件接收成功"); // 发送确认消息
dos.close();
dis.close();
fos.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.Socket;
public class FileClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888); // 创建客户端Socket对象
System.out.println("已连接服务器");
DataInputStream dis = new DataInputStream(socket.getInputStream()); // 获取输入流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); // 获取输出流
String filePath = "path/to/file"; // 文件路径
File file = new File(filePath);
String fileName = file.getName(); // 获取文件名
long fileSize = file.length(); // 获取文件大小
dos.writeUTF(fileName); // 发送文件名
dos.writeLong(fileSize); // 发送文件大小
FileInputStream fis = new FileInputStream(file); // 创建文件输入流
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes, 0, bytes.length)) != -1) { // 从文件中读取数据并发送
dos.write(bytes, 0, length);
dos.flush();
}
System.out.println("文件发送完成");
String response = dis.readUTF(); // 接收确认消息
System.out.println("服务器消息:" + response);
dos.close();
dis.close();
fis.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
原理解析
Java Socket监听端口传输文件的原理是通过ServerSocket和Socket进行通信。ServerSocket用于监听客户端的连接请求,一旦有连接请求,就会创建一个Socket与客户端进行通信。在通信过程中,服务器端通过输入流读取客户端发送的文件名和文件大小,并创建文件输出流将文件写入磁盘。客户端通过输出流发送文件名和文件大小,并创建文件输入流读取文件内容并发送给服务器端。通信完成后,服务器端通过输出流发送确认消息给客户端,客户端通过输入流接收确认消息。
序列图
下面是Java Socket监听端口传输文件的序列图:
sequenceDiagram
participant Server as 服务器
participant Client as 客户端
Server->>Client: 等待客户端连接
Client->>Server: 发起连接请求
Server->>Client: 发送确认连接
Client->>Server: 发送文件名和文件大小
Server->>Client: 接收文件名和文件大小
Server->>Client: 发送文件内容
Client->>Server: 接收文件内容
Client->>Server: 发送确认消息
Server->>Client: 接收确认消息
甘特图
下面是Java Socket监听端口传输文件的甘特图:
gantt
title Java Socket监听端口