-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDaemon.java
More file actions
157 lines (132 loc) · 6.02 KB
/
Copy pathDaemon.java
File metadata and controls
157 lines (132 loc) · 6.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import java.io.*;
import java.net.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.HashSet;
import java.util.Set;
public class Daemon {
private final String directoryHost;
private final int directoryPort = 4000;
private final int daemonPort;
private final String daemonAddress;
private final Set<String> availableFiles;
private ServerSocket serverSocket;
public Daemon(String directoryHost, int daemonPort, String daemonAddress, Set<String> availableFiles) {
this.directoryHost = directoryHost;
this.daemonPort = daemonPort;
this.daemonAddress = daemonAddress;
this.availableFiles = availableFiles;
}
public void start() {
try {
serverSocket = new ServerSocket(daemonPort);
System.out.println("Daemon listening on port " + daemonPort);
// Register files with the Directory
registerWithDirectory();
// Start listening for download requests
while (true) {
Socket clientSocket = serverSocket.accept();
new Thread(new FragmentHandler(clientSocket)).start();
}
} catch (IOException e) {
System.err.println("Daemon exception: " + e.getMessage());
}
}
private void registerWithDirectory() {
try {
Registry registry = LocateRegistry.getRegistry(directoryHost, directoryPort);
DirectoryService directoryService = (DirectoryService) registry.lookup("directory_service");
for (String file : availableFiles) {
directoryService.registerFile(file, daemonAddress, daemonPort);
}
System.out.println("Registered files with directory.");
} catch (Exception e) {
System.err.println("Error registering with directory: " + e.getMessage());
}
}
// Inner class to handle fragment requests
private class FragmentHandler implements Runnable {
private final Socket clientSocket;
public FragmentHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try (
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
) {
Object requestType = ois.readObject(); // Read the request type
if ("GET_FILE_SIZE".equals(requestType)) {
String fileName = (String) ois.readObject();
System.out.println("File size requested for: " + fileName);
File file = new File(fileName);
if (file.exists() && availableFiles.contains(fileName)) {
oos.writeObject(file.length()); // Send the file size
System.out.println("Sent file size for " + fileName + ": " + file.length());
} else {
oos.writeObject(null); // File not found
System.out.println("File not found: " + fileName);
}
} else {
// Handle fragment request
String fileName = (String) requestType; // If it's not "GET_FILE_SIZE", assume it's the fileName
int fragmentNumber = (Integer) ois.readObject();
System.out.println("Request for fragment " + fragmentNumber + " of " + fileName);
// TODO: Load the file and send the fragment
byte[] fragment = getFileFragment(fileName, fragmentNumber);
if (fragment != null) {
oos.writeObject(fragment);
System.out.println("Sent fragment " + fragmentNumber + " of " + fileName);
} else {
oos.writeObject(null); // Indicate that the fragment was not found
System.out.println("Fragment " + fragmentNumber + " of " + fileName + " not found.");
}
}
} catch (IOException | ClassNotFoundException e) {
System.err.println("Fragment handler exception: " + e.getMessage());
} finally {
try {
clientSocket.close();
} catch (IOException e) {
System.err.println("Error closing socket: " + e.getMessage());
}
}
}
private byte[] getFileFragment(String fileName, int fragmentNumber) throws IOException {
File file = new File(fileName);
if (!file.exists() || !availableFiles.contains(fileName)) {
return null;
}
long fileSize = file.length();
int fragmentSize = 1024 * 1024; // 1MB
long startByte = (long) fragmentNumber * fragmentSize;
if (startByte >= fileSize) {
return null; // Fragment number is out of range
}
int bytesToRead = (int) Math.min(fragmentSize, fileSize - startByte);
byte[] buffer = new byte[bytesToRead];
try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
raf.seek(startByte);
raf.read(buffer);
}
return buffer;
}
}
public static void main(String[] args) {
if (args.length < 4) {
System.err.println("Usage: Daemon <directoryHost> <daemonPort> <daemonAddress> <file1,file2,...>");
System.exit(1);
}
String directoryHost = args[0];
int daemonPort = Integer.parseInt(args[1]);
String daemonAddress = args[2];
String[] files = args[3].split(",");
Set<String> availableFiles = new HashSet<>();
for (String file : files) {
availableFiles.add(file.trim());
}
Daemon daemon = new Daemon(directoryHost, daemonPort, daemonAddress, availableFiles);
daemon.start();
}
}