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
+ }
0 commit comments