Skip to content

Commit 6824da7

Browse files
committed
first commit
0 parents  commit 6824da7

File tree

4 files changed

+288
-0
lines changed

4 files changed

+288
-0
lines changed

README.md

Whitespace-only changes.

SelectiveRepeatReceiver.java

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package selectiverepeatreceiver;
7+
8+
import java.io.BufferedReader;
9+
import java.io.IOException;
10+
import java.io.InputStreamReader;
11+
import java.io.PrintWriter;
12+
import static java.lang.Thread.sleep;
13+
import java.net.Socket;
14+
import java.util.Arrays;
15+
import java.util.Scanner;
16+
17+
/**
18+
*
19+
* @author Danyal
20+
*/
21+
public class SelectiveRepeatReceiver {
22+
23+
public static void main(String[] args) throws InterruptedException
24+
{
25+
Scanner scan = new Scanner(System.in);
26+
try
27+
{
28+
System.out.println("Enter the IP Address: ");
29+
String IP = scan.next();
30+
System.out.println("Enter port number: ");
31+
String port = scan.next();
32+
Socket usocket = new Socket(IP, Integer.parseInt(port));
33+
BufferedReader inbuffer = new BufferedReader(new InputStreamReader(usocket.getInputStream()));
34+
PrintWriter outbuffer = new PrintWriter(usocket.getOutputStream(), true);
35+
int rn = 0;
36+
boolean naksent = false, ackneeded = false;
37+
boolean datareceived = false;
38+
int m = Integer.parseInt(inbuffer.readLine());
39+
boolean[] marked = new boolean[m];
40+
String data[] = new String[m];
41+
for(int i = 0; i < marked.length; i++)
42+
{
43+
marked[i] = false;
44+
}
45+
while(!datareceived)
46+
{
47+
outbuffer.println("FRAME");
48+
sleep(300);
49+
int frame = Integer.parseInt(inbuffer.readLine());
50+
if(frame != rn && !naksent && frame > rn)
51+
{
52+
outbuffer.println("NACK" + rn);
53+
System.out.println("Received frame number" + frame + " when " + rn + " was expected. Sending NACK" + rn + ".");
54+
System.out.println("Sent NACK" + rn);
55+
naksent = true;
56+
continue;
57+
}
58+
else if(frame < rn)
59+
{
60+
System.out.println("Discarded frame number " + frame + " as it's < rn");
61+
continue;
62+
}
63+
64+
if(isBetween(frame, rn, rn + m, m)&&(!marked[frame]))
65+
{
66+
System.out.println("Stored " + frame + " at " + frame + ".");
67+
data[frame] = "Frame" + Integer.toString(frame);
68+
marked[frame] = true;
69+
System.out.println("Marked " + frame + " as received.");
70+
while(marked[rn])
71+
{
72+
System.out.println(rn + " is marked. Moving to " + (rn + 1) + ".");
73+
rn++;
74+
ackneeded = true;
75+
if(rn >= marked.length)
76+
{
77+
datareceived = true;
78+
break;
79+
}
80+
}
81+
if(ackneeded)
82+
{
83+
System.out.println("ACK is needed. Sending out ACK" + rn + ".");
84+
outbuffer.println("ACK"+rn);
85+
ackneeded = false;
86+
naksent = false;
87+
}
88+
}
89+
System.out.println(Arrays.toString(data));
90+
}
91+
System.out.println("Data successfully retreieved. Final output is:\n" + Arrays.toString(data));
92+
outbuffer.println("FINISH");
93+
inbuffer.close();
94+
outbuffer.close();
95+
usocket.close();
96+
}
97+
catch(IOException e)
98+
{
99+
e.printStackTrace();
100+
}
101+
}
102+
static boolean isBetween(int num, int n1, int n2, int mod)
103+
{
104+
if(num == n1)
105+
return true;
106+
107+
while(n1 != n2)
108+
{
109+
n1 = (n1 + 1)%mod;
110+
if(num == n1)
111+
return true;
112+
}
113+
return false;
114+
}
115+
}

SelectiveRepeatSender.java

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package selectiverepeatsender;
7+
8+
import java.io.BufferedReader;
9+
import java.io.IOException;
10+
import java.io.InputStreamReader;
11+
import java.io.PrintWriter;
12+
import java.net.ServerSocket;
13+
import java.net.Socket;
14+
import java.util.Scanner;
15+
16+
/**
17+
*
18+
* @author Danyal
19+
*/
20+
public class SelectiveRepeatSender
21+
{
22+
public static void main(String[] args) throws InterruptedException
23+
{
24+
Scanner scan = new Scanner(System.in);
25+
int sw, sf = 0, sn = 0, m;
26+
System.out.println("Input the value of 'm': ");
27+
m = scan.nextInt();
28+
sw = (int)Math.pow(2, m - 1);
29+
int timeout = 200;
30+
String[] data = new String[(int)Math.pow(2,m)];
31+
Timeout[] timers = new Timeout[sw];
32+
for(int i = 0; i < data.length; i++)
33+
{
34+
data[i] = Integer.toString(i);
35+
} //Generating string data to send.
36+
m = (int)Math.pow(2, m);
37+
try
38+
{
39+
int portnumber = 2325;
40+
ServerSocket uservice = new ServerSocket(portnumber);
41+
System.out.println("Port number is: " + portnumber);
42+
Socket usocket = uservice.accept();
43+
System.out.println("accepted");
44+
BufferedReader inbuffer = new BufferedReader(new InputStreamReader(usocket.getInputStream()));
45+
PrintWriter outbuffer = new PrintWriter(usocket.getOutputStream(), true);
46+
long[] timervals = new long[sw];
47+
for(int i = 0; i < timervals.length; i++)
48+
timervals[i] = Long.MAX_VALUE;
49+
outbuffer.println(Integer.toString(m));
50+
System.out.println("Done writing.");
51+
while(true)//for(int i = 0; i < data.length; i++)
52+
{
53+
String incoming = inbuffer.readLine();
54+
if(incoming.contains("ACK"))
55+
{
56+
if(incoming.contains("NACK"))
57+
{
58+
System.out.println(incoming + " received.");
59+
int nackno = Integer.parseInt(incoming.substring(4, incoming.length()));
60+
if(isBetween(nackno, Integer.parseInt(data[sf%m]), Integer.parseInt(data[sn%m]), m))
61+
{
62+
System.out.println("Sending out " + data[nackno] + ".");
63+
outbuffer.println(data[nackno]);
64+
if(timers[nackno%sw]!=null)
65+
{
66+
System.out.println("Cancelling timer number " + nackno + ".");
67+
timers[nackno%sw].timer.cancel();
68+
timers[nackno%sw] = null;
69+
}
70+
System.out.println("Creating new timer in " + nackno);
71+
timers[nackno%sw] = new Timeout(outbuffer, data[nackno], timeout);
72+
}
73+
}
74+
else
75+
{
76+
System.out.println(incoming + " received.");
77+
int ackno = Integer.parseInt(incoming.substring(3, incoming.length()));
78+
if(isBetween(ackno, Integer.parseInt(data[sf%m]), Integer.parseInt(data[sn%m]), m))
79+
{
80+
while(Integer.parseInt(data[sf%m]) != ackno)
81+
{
82+
System.out.println("Cancelling timer number " + sf%sw + ".");
83+
timers[sf%sw].timer.cancel();
84+
timers[sf%sw] = null;
85+
sf++;
86+
}
87+
}
88+
}
89+
}
90+
else if(incoming.contains("FRAME"))
91+
{
92+
System.out.println("Receieved frame request packet.");
93+
if(sn-sf >= sw)
94+
{
95+
System.out.println("Window size is already max. Not sending out frame.");
96+
continue;
97+
}
98+
System.out.println("Sending out frame number " + sn%m);
99+
outbuffer.println(data[sn%m]);
100+
timers[sn%sw] = new Timeout(outbuffer, data[sn%m], timeout);
101+
sn++;
102+
}
103+
else if(incoming.equals("FINISH"))
104+
{
105+
System.out.println("Finished serving the client.");
106+
break;
107+
}
108+
//sleep(50);
109+
}
110+
inbuffer.close();
111+
outbuffer.close();
112+
usocket.close();
113+
uservice.close();
114+
System.exit(0);
115+
}
116+
catch (IOException e)
117+
{
118+
System.out.println(e);
119+
}
120+
}
121+
static boolean isBetween(int num, int n1, int n2, int mod)
122+
{
123+
if(num == n1)
124+
return true;
125+
126+
while(n1 != n2)
127+
{
128+
n1 = (n1 + 1)%mod;
129+
if(num == n1)
130+
return true;
131+
}
132+
return false;
133+
}
134+
}

Timeout.java

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package selectiverepeatsender;
7+
8+
import java.io.PrintWriter;
9+
import java.util.Timer;
10+
import java.util.TimerTask;
11+
12+
/**
13+
*
14+
* @author Danyal
15+
*/
16+
public class Timeout
17+
{
18+
Timer timer;
19+
PrintWriter stream;
20+
String data;
21+
public Timeout(PrintWriter stream, String data, int milliseconds)
22+
{
23+
this.stream = stream;
24+
timer = new Timer();
25+
timer.scheduleAtFixedRate(new TimeoutTask(), milliseconds, milliseconds);
26+
this.data = data;
27+
System.out.println("Created new timer with data " + data + ".");
28+
29+
}
30+
class TimeoutTask extends TimerTask
31+
{
32+
@Override
33+
public void run()
34+
{
35+
System.out.println("Timed out, resending " + data + ".");
36+
stream.println(data);
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)