JAVA每日知识3.26

资深的 Java 项目代码:分布式文件存储系统模拟

代码示例

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;

// 文件块类
class FileBlock implements Serializable {
    private final String blockId;
    private final byte[] data;

    public FileBlock(String blockId, byte[] data) {
        this.blockId = blockId;
        this.data = data;
    }

    public String getBlockId() {
        return blockId;
    }

    public byte[] getData() {
        return data;
    }
}

// 文件存储节点类
class FileStorageNode {
    private static final int PORT = 9000;
    private final ServerSocket serverSocket;
    private final ExecutorService executorService;
    private final Map<String, FileBlock> blockStore;

    public FileStorageNode() throws IOException {
        this.serverSocket = new ServerSocket(PORT);
        this.executorService = Executors.newCachedThreadPool();
        this.blockStore = new ConcurrentHashMap<>();
        startListening();
    }

    private void startListening() {
        executorService.submit(() -> {
            while (true) {
                try {
                    Socket socket = serverSocket.accept();
                    handleClient(socket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void handleClient(Socket socket) {
        executorService.submit(() -> {
            try (ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
                 ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
                String command = (String) in.readObject();
                if ("STORE".equals(command)) {
                    FileBlock block = (FileBlock) in.readObject();
                    blockStore.put(block.getBlockId(), block);
                    out.writeObject("Block stored successfully");
                } else if ("FETCH".equals(command)) {
                    String blockId = (String) in.readObject();
                    FileBlock block = blockStore.get(blockId);
                    out.writeObject(block);
                }
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void shutdown() {
        try {
            serverSocket.close();
            executorService.shutdown();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 文件存储客户端类
class FileStorageClient {
    private final String serverAddress;
    private final int serverPort;

    public FileStorageClient(String serverAddress, int serverPort) {
        this.serverAddress = serverAddress;
        this.serverPort = serverPort;
    }

    public void storeBlock(FileBlock block) {
        try (Socket socket = new Socket(serverAddress, serverPort);
             ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
             ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
            out.writeObject("STORE");
            out.writeObject(block);
            String response = (String) in.readObject();
            System.out.println(response);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public FileBlock fetchBlock(String blockId) {
        try (Socket socket = new Socket(serverAddress, serverPort);
             ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
             ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
            out.writeObject("FETCH");
            out.writeObject(blockId);
            return (FileBlock) in.readObject();
        } catch (IOException | ClassNotFoundExcept