-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReceiver.java
95 lines (57 loc) · 2.37 KB
/
Receiver.java
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
import java.util.ArrayList;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receiver {
/** probability of ACK loss */
public static final double probability = 0.01;
public static void main(String[] args) throws Exception{
/** get port number from argument */
int port = Integer.parseInt(args[0]);
DatagramSocket fromSender = new DatagramSocket(port);
/** the base size (in bytes) of a serialized RDTPacket object is 83 */
byte[] datareceived = new byte[Sender.mss + 83];
int nextseqnum = 0;
ArrayList<RDTPacket> received = new ArrayList<RDTPacket>();
boolean end = false;
while(!end){
System.out.println("Waiting for packet...");
/** get the packet */
DatagramPacket packetreceived = new DatagramPacket(datareceived, datareceived.length);
fromSender.receive(packetreceived);
/** unserialize to a RDTPacket object */
RDTPacket packet = (RDTPacket) Serializer.toObject(packetreceived.getData());
System.out.println("Packet with sequence number " + packet.getSeq() + " is received (last: " + packet.isLast() + ")");
if(packet.getSeq() == nextseqnum && packet.isLast()){
nextseqnum++;
received.add(packet);
System.out.println("Last packet is received");
end = true;
}else if(packet.getSeq() == nextseqnum){
nextseqnum++;
received.add(packet);
System.out.println("Packet is stored in buffer");
}else{
System.out.println("Packet is discarded (not in order)");
}
/** initialize a RDTAck object */
RDTAck ackObject = new RDTAck(nextseqnum);
/** use Serializer */
byte[] ackBytes = Serializer.toBytes(ackObject);
DatagramPacket ackPacket = new DatagramPacket(ackBytes, ackBytes.length, packetreceived.getAddress(), packetreceived.getPort());
/** send packet with a probability of loss */
if(Math.random() > probability){
fromSender.send(ackPacket);
}else{
System.out.println("[X] Lost ACK with sequence number " + ackObject.getPacket());
}
System.out.println("Sending ACK to sequence number " + nextseqnum + " of " + ackBytes.length + " bytes...");
}
/** print the received data */
System.out.println(" *********************** DATA *********************** ");
for(RDTPacket i : received){
for(byte j: i.getData()){
System.out.print((char) j);
}
}
}
}