Project

General

Profile

Statistics
| Revision:

root / proj / src / MessageParser.java @ 2

History | View | Annotate | Download (5.98 KB)

1
import java.io.IOException;
2
import java.io.UnsupportedEncodingException;
3
import java.net.DatagramPacket;
4
import java.net.UnknownHostException;
5
import java.nio.charset.Charset;
6
import java.nio.charset.StandardCharsets;
7
import java.util.Arrays;
8
import java.util.Random;
9
import java.util.concurrent.TimeUnit;
10

    
11
public class MessageParser implements Runnable {
12

    
13
        Peer peer;
14
        DatagramPacket packet;
15
        
16
        public MessageParser(DatagramPacket packet, Peer peer) {
17
                this.peer = peer;
18
                this.packet = packet;
19
                
20
        }
21

    
22
        public void run() {
23
                
24
                
25
                String str = null;
26

    
27
                str = new String(packet.getData(),0, packet.getLength());
28
        
29
                
30
                String rest = null, fileID = null, messageType = null, version = null;
31
                int i = 0, next = 0, chunkNo = 0, replicationDeg = 0, senderID=0;
32
                byte[] body = null;
33

    
34
             if(str.contains(" ")){
35
                    i= str.indexOf(" ");
36
              messageType= str.substring(0,i);
37
              next = str.indexOf(" ", i+1);
38
              version = str.substring(i,next).replace(" ","");
39
              i = next;
40
              next = str.indexOf(" ", i+1);
41
              senderID = Integer.parseInt(str.substring(i,next).replace(" ",""));
42
              i = next;
43
              next = str.indexOf(" ", i+1);
44
              fileID = str.substring(i,next).replace(" ",""); 
45
              i = next;
46
              next = str.indexOf(" ",i+1);
47
              chunkNo = Integer.parseInt(str.substring(i,next).replace(" ",""));
48
              i = next;
49
              next = str.indexOf(" ",i+1);
50
              replicationDeg = Integer.parseInt(str.substring(i,next).replace(" ",""));
51
              rest = str.substring(next);
52
             }
53
            
54
            
55
                if(peer.getPeerID() == senderID) {
56
                        return;
57
                }
58
                
59
        
60
                String CRLF = "" + (char) 0xD  + (char) 0xA;
61
                
62
                String bodyString = rest.replaceFirst(CRLF+CRLF,"");
63
                
64
                bodyString = bodyString.replaceFirst(" ", "");
65
                
66
                        
67
                        body = bodyString.getBytes();
68
        
69
                
70
                
71

    
72
                switch(messageType) {
73
                
74
                case "PUTCHUNK":
75
                        
76
                        Chunk chunk = new Chunk(fileID, chunkNo, body);
77
                        chunk.setGoalRepDeg(replicationDeg);
78
                        if(peer.getStorage().addChunk(chunk)) {
79

    
80
                        Message stored = new Message("STORED",peer.getVersion(),peer.getPeerID(),fileID, chunkNo, 0, null);
81
                        byte[] reply = stored.sendable();
82
                        
83
                        try {
84
                                
85
                                Random rand = new Random();
86
                                int  n = rand.nextInt(400) + 1;
87
                                
88
                                
89
                                try {
90
                                        Thread.sleep(n);
91
                                } catch (InterruptedException e) {
92
                                        e.printStackTrace();
93
                                } 
94
                                
95
                                peer.getMC().sendMessage(reply);
96
                                System.out.println(stored.messageToStringPrintable());
97
                        } catch (UnknownHostException e) {
98
                                // TODO Auto-generated catch block
99
                                e.printStackTrace();
100
                        }
101
                                        
102
                        try {
103
                                peer.saveChunks();
104
                        } catch (IOException e) {
105
                                // TODO Auto-generated catch block
106
                                e.printStackTrace();
107
                        }
108
                        
109
                        }
110
                        break;
111
                        
112
                        
113
                case "STORED":
114
                        peer.getStorage().getBackUps().add(new BackUpInfo(fileID, chunkNo, peer.getPeerID()));
115
                        peer.getStorage().increaseChunkRepDeg(fileID, chunkNo);
116
                
117
                
118
                break;
119
                
120
                case "GETCHUNK": //CHUNK <Version> <SenderId> <FileId> <ChunkNo> <CRLF><CRLF><Body>
121
                        
122
                        Random rand = new Random();
123
                        int  n = rand.nextInt(400) + 1;
124
                        
125
                        
126
                        try {
127
                                Thread.sleep(n);
128
                        } catch (InterruptedException e) {
129
                                e.printStackTrace();
130
                        } 
131
                        
132
                        for(Chunk chunkSend: peer.getStorage().getChunks()) {
133
                                
134
                        if(chunkSend.getFileID().equals(fileID) && chunkSend.getChunkN()==chunkNo) {
135
                                
136
                                
137

    
138
                                Message sendChunk = new Message("CHUNK",peer.getVersion(),peer.getPeerID(),fileID, chunkNo, 0, chunkSend.getContent());
139
                                
140
                                byte[] reply = sendChunk.sendable();
141
                                System.out.println(sendChunk.messageToStringPrintable());
142
                        
143
                                
144
                                try {
145
                                        peer.getMDR().sendMessage(reply);
146
                                } catch (UnknownHostException e) {
147
                                        // TODO Auto-generated catch block
148
                                        e.printStackTrace();
149
                                }
150
                        }
151
                        
152
                }
153
                
154
                        
155
                
156
                break;
157
                
158
                case "CHUNK": //GETCHUNK <Version> <SenderId> <FileId> <ChunkNo> <CRLF><CRLF>
159
                        Chunk gotChunk = new Chunk(fileID, chunkNo, body);
160
                        
161
                        peer.getStorage().addChunk(gotChunk);
162
                        if(gotChunk.getContent().length < 58000)                                
163
                                peer.lastChunk();
164
                        break;
165
                        
166
                case "REMOVED":
167
                        if(peer.getStorage().lowerRepDeg(fileID, chunkNo)) {
168
                        Random rand2 = new Random();
169
                        int  n2 = rand2.nextInt(400) + 1;
170
                        
171
                        
172
                        try {
173
                                Thread.sleep(n2);
174
                        } catch (InterruptedException e) {
175
                                e.printStackTrace();
176
                        } 
177
                        for(Chunk chunkSend: peer.getStorage().getChunks())
178
                        {
179
                                if(chunkSend.getFileID().equals(fileID) && chunkSend.getChunkN() == chunkNo)
180
                                {
181
                                        boolean stored = false;
182
                                        
183
                                        Message msg = new Message("PUTCHUNK", version, peer.getPeerID(),chunkSend.getFileID(),chunkNo, chunkSend.getGoalRepDeg()-chunkSend.getRepDeg(),
184
                                                        chunkSend.getContent());
185
                                        byte[] msgByte = msg.sendable();
186
                
187
                                        System.out.println(msg.messageToStringPrintable());
188
                                        try {
189
                                                peer.getMDB().sendMessage(msgByte);
190
                                        } catch (UnknownHostException e2) {
191
                                                // TODO Auto-generated catch block
192
                                                e2.printStackTrace();
193
                                        }                                        
194
                                        
195
                                        for(int j = 0; j < 5 && !stored; j++) {
196
                                                
197
                                        try {
198
                                                TimeUnit.SECONDS.sleep(1+j);
199
                                        } catch (InterruptedException e1) {
200
                                                // TODO Auto-generated catch block
201
                                                e1.printStackTrace();
202
                                        }
203
                                        
204
                                        if(peer.storedCheck(chunkNo, fileID) >= chunkSend.getGoalRepDeg()) {
205
                                                stored = true;
206
                                        } 
207
                                        else {
208
                                                try {
209
                                                        peer.getMDB().sendMessage(msgByte);
210
                                                } catch (UnknownHostException e) {
211
                                                        // TODO Auto-generated catch block
212
                                                        e.printStackTrace();
213
                                                } 
214
                                                System.out.println(msg.messageToStringPrintable());
215
                                                
216
                                        }
217
                                        } 
218
                                        stored = false;
219
                                }
220
                                
221
                        }
222
                        }
223
                
224
            break;
225
            
226
                case "DELETE":
227
            peer.getStorage().deleteChunkByFileID(fileID);
228
            peer.deleteFileFolder(fileID);
229
            break;
230
                }
231
        }
232
        static byte[] trim(byte[] bytes)
233
        {
234
            int i = bytes.length - 1;
235
            while (i >= 0 && bytes[i] == 0)
236
            {
237
                --i;
238
            }
239

    
240
            return Arrays.copyOf(bytes, i + 1);
241
        }
242

    
243

    
244
        }
245

    
246
        
247