- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMultiCastReceiver.java
More file actions
Latest commit
103 lines (81 loc) · 4.28 KB
/
Copy pathMultiCastReceiver.java
File metadata and controls
103 lines (81 loc) · 4.28 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
importjava.io.*;
importjava.net.DatagramPacket;
importjava.net.InetAddress;
importjava.net.MulticastSocket;
importjava.util.ArrayList;
classMultiCastReceiver {
publicstaticvoidmain(String[] args){
ArrayList<Mensaje> msgsDelivered = newArrayList<Mensaje>();
ArrayList<Mensaje> msgs_hold_back_queue = newArrayList<Mensaje>();
ArrayList<Integer> listaprueba = newArrayList<Integer>();
Requestrequest = newRequest(5);
IntegerRIndex = 0;
try{
InetAddressgroup = InetAddress.getByName("225.4.5.6");
while(true){
// The message is received
MulticastSocketmulticastSock = newMulticastSocket(3456);
multicastSock.joinGroup(group);
byte[] buffer = newbyte[1000];
DatagramPacketpacket = newDatagramPacket(buffer, buffer.length);
multicastSock.receive(packet);
//String msg=new String(buffer);
//this set of code turns a incoming set of bytes to its corresponding object, **Check wether you have to set o to Object instead
//of Mensaje as by now I don't know how the application will be tested
MensajemensajeActual = null;
ByteArrayInputStreambis = newByteArrayInputStream(buffer);
ObjectInputin = null;
try {
in = newObjectInputStream(bis);
mensajeActual = (Mensaje) in.readObject();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOExceptionex) {
// ignore close exception
}
}
//
intflag= 0;
// Se ve si se puede entregar
for(Mensajee: msgsDelivered){
if(mensajeActual.getId()==(e.getId())){
flag=1;
System.out.println("Ya se ha recibido este mensaje");
}
}
// Si se puede recibir se entrega
if(flag==0){
// Check if even if it is not delivered there should be a received form of storage
if(mensajeActual.getId()==RIndex+1){
msgsDelivered.add(mensajeActual); // se entrega
System.out.println("Se ha recibido y almacenado un mensaje");
System.out.println(mensajeActual.getMensaje());
System.out.println("Se reenviara a todos los agentes del grupo");
byte[] yourBytes = mensajeActual.getInSendingForm(); //turns object to bytes to send
DatagramPacketpacket_out = newDatagramPacket(yourBytes,yourBytes.length, group, 3456);
multicastSock.send(packet_out);
RIndex++;
}elseif(mensajeActual.getId()<=RIndex){
System.out.println("Se ignora el mensaje");
}elseif(mensajeActual.getId()>RIndex+1){
System.out.println("Se debe ponerlo en la hold back queue");
msgs_hold_back_queue.add(mensajeActual);
request.start();
Thread.sleep(6000);
request.numero=15;
//ask if when meesages get requested, the ones that got them should send directly to the ones in need or to everyone. Solved: it should request just to the server not to others participants.
}
// Aqui se deberia de manejar el caso de que el que esta mandando sea el mismo proceso del que acaba de recibir
// pero dado a que el metodo send solo manda un DatagramPacket se me hace imposible poder mandar algun tipo de id
// del proceso que esta enviando y asi manejar este caso --------->Se logro manejar este problema
}
multicastSock.close();
}
}catch(Exceptione ){
e.printStackTrace();
}
}
}