root / src / channels / MdbChannel.java
History | View | Annotate | Download (3.47 KB)
1 |
package channels; |
---|---|
2 |
|
3 |
import peer.Peer; |
4 |
import utils.FileController; |
5 |
import utils.Utils; |
6 |
|
7 |
import java.io.File; |
8 |
import java.io.IOException; |
9 |
import java.net.DatagramPacket; |
10 |
import java.util.ArrayList; |
11 |
import java.util.Random; |
12 |
|
13 |
public class MdbChannel implements Runnable{ |
14 |
public void run() { |
15 |
while(true){ |
16 |
byte[] buf = new byte[65000]; //header + body |
17 |
|
18 |
DatagramPacket receivedPacket = new DatagramPacket(buf,buf.length); |
19 |
|
20 |
try {
|
21 |
//received chunck
|
22 |
Utils.mdbSocket.receive(receivedPacket); |
23 |
String received = new String(receivedPacket.getData(),0,receivedPacket.getLength()); |
24 |
String[] receivedArray = received.split("\\r\\n\\r\\n"); //separate header from body |
25 |
int offsetOfBody = receivedArray[0].length() + 4; |
26 |
|
27 |
String receivedChunkData = received.substring(offsetOfBody, received.length());
|
28 |
|
29 |
int size = received.length() - offsetOfBody;
|
30 |
byte[] toRet = new byte[size]; |
31 |
|
32 |
for(int i = offsetOfBody; i < received.length(); i++) { |
33 |
toRet[i - offsetOfBody] = receivedPacket.getData()[i]; |
34 |
} |
35 |
|
36 |
FileController receivedFile = new FileController(receivedArray, toRet);
|
37 |
|
38 |
|
39 |
//addToChunkDatabase
|
40 |
if(!Utils.storedChunks.containsKey(receivedFile.getHashedFileId() + ":" + receivedFile.getChunkNo())){ |
41 |
Utils.storedChunks.put(receivedFile.getHashedFileId() + ":" + receivedFile.getChunkNo(),new ArrayList<Integer>()); |
42 |
Utils.storedChunks.get(receivedFile.getHashedFileId() + ":" + receivedFile.getChunkNo()).add(Integer.parseInt(receivedFile.getReplicationDeg())); |
43 |
} |
44 |
|
45 |
//saveFileIfSentFromAnotherPeer
|
46 |
if(! (receivedFile.getSenderId() == Peer.getSenderId())) {
|
47 |
|
48 |
//System.out.println("MDB: Received CMD - " + receivedFile.getStringInformation());
|
49 |
if(!checkIfFileExists(receivedFile.getHashedFileId() + receivedFile.getChunkNo()))
|
50 |
receivedFile.saveToDisk(Peer.getSenderId(),receivedFile.getChunkNo()); |
51 |
try {
|
52 |
Thread.sleep(new Random().nextInt(400)); |
53 |
} catch (InterruptedException e) { |
54 |
e.printStackTrace(); |
55 |
} |
56 |
sendStoredMessage(receivedFile); |
57 |
} |
58 |
} |
59 |
catch(IOException e){ |
60 |
e.getCause(); |
61 |
} |
62 |
|
63 |
|
64 |
} |
65 |
|
66 |
|
67 |
} |
68 |
|
69 |
private void sendStoredMessage(FileController receivedFile) throws IOException { |
70 |
String message = ("STORED " + receivedFile.getVersion() + " " + |
71 |
Peer.getSenderId() + " " + receivedFile.getHashedFileId()
|
72 |
+ " " + receivedFile.getChunkNo() + Utils.crlf);
|
73 |
byte[] buf = new byte[256]; |
74 |
buf = message.getBytes(); |
75 |
|
76 |
DatagramPacket packet = new DatagramPacket(buf,buf.length, Peer.getMcAddress(),Peer.getMcPort()); |
77 |
Utils.mcSocket.send(packet); |
78 |
} |
79 |
|
80 |
public static void sendMessage(byte[] buf) throws IOException{ |
81 |
DatagramPacket packet = new DatagramPacket(buf,buf.length, Peer.getMdbAddress(),Peer.getMdbPort()); |
82 |
Utils.mdbSocket.send(packet); |
83 |
} |
84 |
|
85 |
private boolean checkIfFileExists(String string) { |
86 |
File f = new File("src/test/" + Peer.getSenderId() + "/" + string); |
87 |
if(f.exists() && !f.isDirectory())
|
88 |
return true; |
89 |
return false; |
90 |
} |
91 |
} |