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监听端口