在 Java 中实现 WebSocket 接收文件数据有多种方式,以下将介绍两种常见的实现方式:使用 Java 标准库的 javax.websocket 包以及使用第三方库 WebSocket API (例如,Tyrus 库)。每种方式都会详细说明其步骤流程,并提供相应的代码示例。
javax.websocket.Endpoint 接口,重写 onOpen 和 onMessage 方法来处理 WebSocket 连接和消息。onMessage 方法中,接收并处理从客户端发送的文件数据。依赖坐标:
这种方式使用 Java 标准库,无需额外的依赖。
示例代码:
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.*;
import java.nio.ByteBuffer;
@ServerEndpoint("/fileWebSocket")
public class FileWebSocketEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket connection opened: " + session.getId());
    }
    @OnMessage
    public void onMessage(Session session, ByteBuffer byteBuffer, boolean last) {
        try {
            String fileName = (String) session.getUserProperties().get("fileName");
            if (fileName == null) {
                fileName = "received_file";
            }
            File outputFile = new File(fileName);
            FileOutputStream outputStream = new FileOutputStream(outputFile, true);
            byte[] data = new byte[byteBuffer.remaining()];
            byteBuffer.get(data);
            outputStream.write(data);
            if (last) {
                outputStream.close();
                System.out.println("File received and saved: " + outputFile.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
javax.websocket.Endpoint 接口,处理 WebSocket 连接和消息。依赖坐标:
Maven 依赖:
<dependency>
    <groupId>org.glassfish.tyrus</groupId>
    <artifactId>tyrus-server</artifactId>
    <version>1.17</version>
</dependency>
Gradle 依赖:
implementation 'org.glassfish.tyrus:tyrus-server:1.17'
示例代码:
import org.glassfish.tyrus.server.Server;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.*;
import java.nio.ByteBuffer;
@ServerEndpoint("/fileWebSocket")
public class FileWebSocketEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket connection opened: " + session.getId());
    }
    @OnMessage
    public void onMessage(Session session, ByteBuffer byteBuffer, boolean last) {
        try {
            String fileName = (String) session.getUserProperties().get("fileName");
            if (fileName == null) {
                fileName = "received_file";
            }
            File outputFile = new File(fileName);
            FileOutputStream outputStream = new FileOutputStream(outputFile, true);
            byte[] data = new byte[byteBuffer.remaining()];
            byteBuffer.get(data);
            outputStream.write(data);
            if (last) {
                outputStream.close();
                System.out.println("File received and saved: " + outputFile.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Server server = new Server("localhost", 8080, "/websocket", FileWebSocketEndpoint.class);
        try {
            server.start();
            System.out.println("WebSocket server started...");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.stop();
        }
    }
}
这些示例代码演示了如何在 Java 中使用 javax.websocket 包和 Tyrus 库来实现 WebSocket 接收文件数据的功能。您可以根据自己的需求进行进一步的定制和扩展。记得将示例代码中的路径、端口等配置项根据您的实际情况进行适当修改。