资深的 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