杰瑞科技汇

Java Socket如何高效发送文件?

Java Socket 发送文件实现指南

在Java中使用Socket发送文件是一个常见的网络编程任务,下面我将提供一个完整的实现方案,包括服务端和客户端代码。

Java Socket如何高效发送文件?-图1
(图片来源网络,侵删)

基本原理

  1. 服务端监听特定端口等待客户端连接
  2. 客户端连接到服务端
  3. 客户端读取本地文件并发送
  4. 服务端接收文件并保存到本地

完整实现代码

服务端代码 (FileServer.java)

import java.io.*;
import java.net.*;
public class FileServer {
    public static void main(String[] args) {
        int port = 12345;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("服务器已启动,等待连接...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接: " + clientSocket.getInetAddress());
            // 接收文件名
            DataInputStream dis = new DataInputStream(clientSocket.getInputStream());
            String fileName = dis.readUTF();
            System.out.println("接收文件名: " + fileName);
            // 接收文件大小
            long fileSize = dis.readLong();
            System.out.println("文件大小: " + fileSize + " bytes");
            // 接收文件内容
            FileOutputStream fos = new FileOutputStream("received_" + fileName);
            byte[] buffer = new byte[4096];
            int bytesRead;
            long totalBytesRead = 0;
            while (totalBytesRead < fileSize && (bytesRead = dis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
            }
            fos.close();
            dis.close();
            clientSocket.close();
            System.out.println("文件接收完成: " + "received_" + fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码 (FileClient.java)

import java.io.*;
import java.net.*;
public class FileClient {
    public static void main(String[] args) {
        String serverAddress = "localhost";
        int port = 12345;
        String filePath = "example.txt"; // 要发送的文件路径
        try (Socket socket = new Socket(serverAddress, port);
             FileInputStream fis = new FileInputStream(filePath);
             DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) {
            // 发送文件名
            File file = new File(filePath);
            dos.writeUTF(file.getName());
            // 发送文件大小
            long fileSize = file.length();
            dos.writeLong(fileSize);
            // 发送文件内容
            byte[] buffer = new byte[4096];
            int bytesRead;
            long totalBytesSent = 0;
            while ((bytesRead = fis.read(buffer)) != -1) {
                dos.write(buffer, 0, bytesRead);
                totalBytesSent += bytesRead;
                System.out.println("已发送: " + totalBytesSent + " / " + fileSize + " bytes");
            }
            fis.close();
            dos.close();
            System.out.println("文件发送完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键点说明

  1. 文件传输协议:

    • 首先发送文件名(UTF字符串)
    • 然后发送文件大小(long类型)
    • 最后发送文件内容(字节流)
  2. 缓冲区处理:

    • 使用4KB的缓冲区进行读写,提高效率
    • 循环读取直到整个文件传输完成
  3. 进度显示:

    客户端会显示已发送字节数/总字节数

    Java Socket如何高效发送文件?-图2
    (图片来源网络,侵删)
  4. 资源管理:

    使用try-with-resources确保所有流和socket正确关闭

增强功能建议

  1. 错误处理:

    • 添加文件不存在、网络中断等异常处理
    • 验证接收的文件大小是否与发送的一致
  2. 多文件传输:

    • 可以扩展协议支持多文件传输
    • 添加文件结束标记
  3. 加密传输:

    • 使用SSL/TLS加密Socket通信
    • 进行加密
  4. 进度回调:

    添加进度监听接口,实时报告传输进度

  5. 断点续传:

    记录已传输位置,支持从中断处继续传输

运行步骤

  1. 编译两个Java文件:

    javac FileServer.java
    javac FileClient.java
  2. 先启动服务端:

    java FileServer
  3. 在另一个终端启动客户端:

    java FileClient
  4. 服务端会收到文件并保存为"received_example.txt"

这个实现提供了基本的文件传输功能,可以根据实际需求进行扩展和优化。

分享:
扫描分享到社交APP
上一篇
下一篇