-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReceiver2a.java
More file actions
115 lines (86 loc) · 3.77 KB
/
Receiver2a.java
File metadata and controls
115 lines (86 loc) · 3.77 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
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Arrays;
public class Receiver2a {
public static void main(String[] args) throws Exception
{
String port_number = args[0];
String file_name = args[1];
ArrayList<byte[]> allPackets = new ArrayList<byte[]>();
DatagramSocket serverSocket = new DatagramSocket(Integer.parseInt(port_number));
byte[] receiveData = new byte[1027];
byte[] sendData = new byte[] {0,1};
int last_recieved_ack = 0;
while(true) {
//recieving data from the client
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
byte[] saved_pack = new byte[receivePacket.getLength()-3];
for (int i = 0; i<receivePacket.getLength()-3; i++){
saved_pack[i] = receivePacket.getData()[i+3];
}
// configuring the IPAdress and port of the client
InetAddress IPAddress = receivePacket.getAddress();
//int port = receivePacket.getPort();
//System.out.println("Pack recieved!");
//System.out.println(Arrays.toString(receivePacket.getData()));
//send the sequence number as ACK packet
int recently_recieved_ack = (receivePacket.getData()[0]<<8) + (receivePacket.getData()[1] & 0xff);
if(recently_recieved_ack == last_recieved_ack +1 || recently_recieved_ack == 0)
{
// sending the recently recieved ack to sender
byte[] ack = new byte[] {receivePacket.getData()[0], receivePacket.getData()[1]};
//System.out.println("With ACK " + ((ack[0]<<8) + (ack[1] & 0xff)));
DatagramPacket sendPacket = new DatagramPacket(ack, ack.length, IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
allPackets.add(saved_pack);
// update last recieved ack to the recently recieved ack
last_recieved_ack = recently_recieved_ack;
// if end of the file, then break
if(receivePacket.getData()[2] == 1){
break;
}
}
else
{
// send the previous one and don't save anything
byte[] ack = new byte[]{(byte) (last_recieved_ack >> 8), (byte) last_recieved_ack};
System.out.println("With ACK " + ((ack[0]<<8) + (ack[1] & 0xff)));
DatagramPacket sendPacket = new DatagramPacket(ack, ack.length, IPAddress, receivePacket.getPort());
serverSocket.send(sendPacket);
}
}
// save the recieved packet
File file = null;
FileOutputStream fileOutputStream = null;
try {
file = new File(file_name);
fileOutputStream = new FileOutputStream(file, true);
//create file if not exists
if (!file.exists()) {
file.createNewFile();
}
for(byte[] pckts: allPackets){
fileOutputStream.write(pckts);
}
fileOutputStream.flush();
fileOutputStream.close();
//System.out.println("File written successfully.");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
allPackets.clear();
//System.out.println(file.length());
System.out.println("Saved the image! Now closing...");
serverSocket.close();
}
}