Mercurial > hg > Members > kono > WifiBroadcast
annotate src/main/java/jp/ac/uryukyu/ie/kono/wifibroadcast/WifiBroadcastTest.java @ 27:12633f67f3cf default tip
jar
author | oshiro |
---|---|
date | Wed, 28 Nov 2018 18:28:39 +0900 |
parents | src/main/jp/ac/uryukyu/ie/kono/wifibroadcast/WifiBroadcastTest.java@42ecbd9364fa |
children |
rev | line source |
---|---|
27 | 1 package jp.ac.uryukyu.ie.kono.wifibroadcast; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
24 | 3 import java.io.File; |
4 import java.io.FileInputStream; | |
5 import java.io.FileNotFoundException; | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 import java.io.IOException; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 import java.nio.ByteBuffer; |
24 | 8 import java.nio.channels.FileChannel; |
15 | 9 import java.util.LinkedList; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 public class WifiBroadcastTest { |
3 | 12 private static int DefaultPort = 8412; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 private static String MCASTADDR = "224.0.0.1"; |
3 | 14 private static int testSize = 256; |
4 | 15 private static long timeout = 1000; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 |
9 | 17 |
15 | 18 LinkedList<Integer> ports = new LinkedList<Integer>(); |
19 LinkedList<String> addresses = new LinkedList<String>(); | |
9 | 20 int count = 16; |
21 boolean multicast = false; | |
22 boolean mchannel = false; | |
23 int receiver_count = 1; | |
24 int sender_count = 1; | |
25 WifiReceiver wbr[] = new WifiReceiver[receiver_count]; | |
26 WifiReceiver wbs[] = new WifiReceiver[sender_count]; | |
12 | 27 private boolean bchannel; |
15 | 28 private boolean tcp; |
18 | 29 private String nis = "en1"; |
19 | 30 private boolean selectMode = false; |
22 | 31 private int portIndex = 0; |
32 private int addressIndex = 0; | |
9 | 33 |
15 | 34 public WifiBroadcastTest() { |
35 ports.add(0,DefaultPort); | |
36 addresses.add(0,MCASTADDR); | |
37 } | |
38 | |
2 | 39 public static void main(String args[]) { |
9 | 40 new WifiBroadcastTest().test(args); |
41 } | |
42 | |
43 public void test(String args[]) { | |
44 options(args); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 try { |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 if (multicast) { |
15 | 47 for(int i=0;i<wbr.length;i++) wbr[i] = new WifiMulticast(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Receiver); |
10 | 48 Thread.sleep(timeout/4); |
15 | 49 for(int i=0;i<wbs.length;i++) wbs[i] = new WifiMulticast(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Sender); |
1 | 50 } else if (mchannel) { |
18 | 51 for(int i=0;i<wbr.length;i++) wbr[i] = new WifiMulticastChannel(i,getAddress(i),getPort(i),nis, WifiReceiver.SocketType.Receiver); |
15 | 52 Thread.sleep(timeout/4); |
18 | 53 for(int i=0;i<wbs.length;i++) wbs[i] = new WifiMulticastChannel(i,getAddress(i),getPort(i),nis, WifiReceiver.SocketType.Sender); |
15 | 54 } else if (tcp) { |
16 | 55 addresses.remove(); addresses.add("127.1"); |
15 | 56 for(int i=0;i<wbr.length;i++) wbr[i] = new WifiTCP(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Receiver); |
57 Thread.sleep(timeout/4); | |
58 for(int i=0;i<wbs.length;i++) wbs[i] = new WifiTCP(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Sender); | |
12 | 59 } else if (bchannel) { |
15 | 60 for(int i=0;i<wbr.length;i++) wbr[i] = new WifiBroadcastChannel(i,getPort(i),WifiReceiver.SocketType.Receiver); |
61 Thread.sleep(timeout/4); | |
62 for(int i=0;i<wbs.length;i++) wbs[i] = new WifiBroadcastChannel(i,getPort(i),WifiReceiver.SocketType.Sender); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 } else { |
15 | 64 for(int i=0;i<wbr.length;i++) wbr[i] = new WifiBroadcast(i,getPort(i),WifiReceiver.SocketType.Receiver); |
10 | 65 Thread.sleep(timeout/4); |
15 | 66 for(int i=0;i<wbs.length;i++) wbs[i] = new WifiBroadcast(i,getPort(i),WifiReceiver.SocketType.Sender); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 } catch (IOException e) { |
3 | 69 System.err.println("err "+e); |
70 } catch (InterruptedException e) { | |
71 System.err.println("err "+e); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 } |
9 | 73 runTest(count, wbr, wbs); |
74 | |
75 } | |
76 | |
15 | 77 private String getAddress(int i) { |
78 return addresses.get(i%addresses.size()); | |
79 } | |
80 | |
81 private int getPort(int i) { | |
82 return ports.get(i%ports.size()); | |
83 } | |
84 | |
85 public void options(String[] args) { | |
86 for(int i=0;i<args.length;i++) { | |
87 switch(args[i]) { | |
88 case "-m": multicast = true; break; | |
89 case "-channel": mchannel = true; break; | |
90 case "-bchannel": bchannel = true; break; | |
91 case "-tcp": tcp = true; break; | |
92 case "-r": i++; receiver_count = getOptInt(args, receiver_count, i); wbr = new WifiReceiver[receiver_count]; break; | |
93 case "-s": i++; sender_count = getOptInt(args, sender_count, i); wbs = new WifiReceiver[sender_count]; break; | |
94 case "-c": i++; count = getOptInt(args, count, i); break; | |
95 case "-t": i++; timeout = getOptInt(args, (int) timeout, i); break; | |
96 case "-T": i++; testSize = getOptInt(args, testSize, i); break; | |
18 | 97 case "-n": i++; nis = getOptString(args, nis, i); break; |
15 | 98 case "-p": i++; setPort(args,i); break; |
99 case "-a": i++; setAddress(args, i); break; | |
19 | 100 case "-select": i++; selectMode = true; break; |
15 | 101 default: i++; |
102 System.out.println( | |
103 "(default) Broadcast DatagramSocket\n"+ | |
104 "-m Multicast DatagramSocket\n"+ | |
105 "-cahnnel Multicast with DatagramChannel\n"+ | |
106 "-bcahnnel Broadcase with DatagramChannel\n"+ | |
107 "-tcp TCP stream\n"+ | |
108 "-r N create N receivers\n"+ | |
109 "-s N create N senders\n"+ | |
110 "-c N send count packet\n"+ | |
111 "-t N timeout N msec\n"+ | |
112 "-T N send N byte packet\n"+ | |
18 | 113 "-n en1 Network Interface name for multicast (default en1)\n"+ |
15 | 114 "-p N broadcast/multicast port\n"+ |
115 "-a S broadcast/multicast address\n"+ | |
19 | 116 "-select use select for timeout\n"+ |
15 | 117 "-h print this\n"+ |
118 "" | |
119 ); | |
120 return; | |
121 } | |
122 } | |
123 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 |
15 | 127 |
128 public void runTest(int count, WifiReceiver[] wbr, WifiReceiver wbs[]) { | |
9 | 129 Thread t = timeouter(); |
130 Thread send[] = new Thread[wbs.length]; | |
131 int id = 0; | |
132 for(WifiReceiver s:wbs) { | |
133 send[id]= sender(s,count); | |
134 id ++; | |
135 } | |
136 id = 0; | |
137 Thread recv[] = new Thread[wbr.length]; | |
138 for(WifiReceiver r: wbr) { | |
139 recv[id] = receiver(r,id, count, timeout); | |
140 id ++; | |
141 } | |
142 try { | |
143 for(int i = 0;i<wbr.length;i++) { | |
144 recv[i].join(); | |
145 } | |
146 for(int i = 0;i<wbs.length;i++) { | |
147 send[i].join(); | |
148 } | |
149 t.join(); | |
150 } catch (InterruptedException e) { | |
151 } | |
152 } | |
153 | |
154 | |
155 | |
156 public int getOptInt(String[] args, int count, int i) { | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 if (i<args.length) { count = Integer.parseInt(args[i]); } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 return count; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 |
12 | 161 public String getOptString(String[] args, String str, int i) { |
22 | 162 if (i<args.length) { str = args[i]; } |
163 return str; | |
12 | 164 } |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 |
22 | 166 private void setAddress(String[] args, int i) { |
167 String adr = getOptString(args,addresses.get(0),i); | |
168 int p; | |
169 if ((p=adr.indexOf(":"))>0) { | |
170 String sp = adr.substring(p+1); | |
171 adr = adr.substring(0,p-1); | |
172 portIndex = addressIndex; | |
173 if (ports.size()>portIndex) ports.remove(portIndex); | |
174 ports.add(portIndex,Integer.parseInt(sp)); | |
175 portIndex ++; | |
176 } | |
177 if (addresses.size()>addressIndex) addresses.remove(addressIndex); | |
178 addresses.add(addressIndex,adr); | |
179 addressIndex++; | |
180 } | |
15 | 181 |
182 private void setPort(String[] args, int i) { | |
22 | 183 String sport = getOptString(args,"0", i); |
184 if (ports.size()>portIndex) ports.remove(portIndex); | |
185 ports.add(portIndex,Integer.parseInt(sport)); | |
186 portIndex++; | |
187 } | |
15 | 188 |
189 public Thread sender(final WifiReceiver wbs, final int count) { | |
19 | 190 wbs.selectMode(selectMode); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 Runnable sender = new Runnable() { |
3 | 192 |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 public void run() { |
24 | 195 // ByteBuffer testData = getTestData(testSize); |
196 ByteBuffer testData = readTestData(); | |
3 | 197 int i = 0; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 try { |
4 | 199 Thread.sleep(timeout); |
3 | 200 for(i = 0; i<count;i++) { |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 testData.putInt(0, i); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 wbs.send(testData); |
2 | 203 testData.flip(); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 } |
3 | 205 } catch (Exception e) { |
206 System.err.println("sender error at "+i+" "+e); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 }; |
2 | 210 Thread s = new Thread(sender); |
211 s.start(); | |
9 | 212 return s; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 |
9 | 215 private boolean running; |
1 | 216 |
9 | 217 public Thread timeouter() { |
1 | 218 running = true; |
219 Runnable timeouter = new Runnable() { | |
220 @Override | |
221 public void run() { | |
222 try { | |
223 Thread.sleep(30*1000); | |
224 } catch (InterruptedException e) { | |
225 } | |
226 running = false; | |
227 } | |
228 }; | |
9 | 229 Thread t = new Thread(timeouter); t.start(); |
230 return t; | |
231 } | |
232 | |
233 public Thread receiver(final WifiReceiver wbr, final int id, final int count, final long timeout) { | |
19 | 234 wbr.selectMode(selectMode); |
1 | 235 Runnable receiver = new Runnable() { |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 @Override |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
237 public void run() { |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 ByteBuffer testData = ByteBuffer.allocate(4096); |
3 | 239 int bad = 0, good = 0; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
240 try { |
24 | 241 for(int i = 0; running && i<count;i++) { |
2 | 242 testData.clear(); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 wbr.recieve(testData,timeout); |
2 | 244 if (!testData.hasRemaining()) continue; |
5 | 245 System.out.println("receive id"+id+":"+testData.remaining()+" bytes."); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 int seq = testData.getInt(); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
247 if (seq!=i) { |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 bad++; i = seq; |
3 | 249 } else { |
250 good++; | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
252 } |
3 | 253 } catch (Exception e) { |
254 System.err.println("receiver error "+e); | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
255 } |
3 | 256 System.out.println("get "+good+" packets, "+bad+" losts."); |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 }; |
2 | 259 Thread r = new Thread(receiver); r.start(); |
9 | 260 return r; |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
261 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
262 |
9 | 263 public ByteBuffer getTestData(int i) { |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
264 ByteBuffer b = ByteBuffer.allocate(i); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
265 b.putInt(0); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
266 for(int j = 0; j<256; j++ ) { |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
267 b.put((byte)j); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
268 if (! b.hasRemaining()) break; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
269 if (j == 255) j=0; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
270 } |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
271 b.flip(); |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
272 return b; |
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
273 } |
24 | 274 |
275 public ByteBuffer readTestData() { | |
276 FileChannel srcChannel = null; | |
277 String path = "./testfile.txt"; | |
278 ByteBuffer buffer = null; | |
279 try { | |
280 srcChannel = fileReader(path).getChannel(); | |
281 buffer = ByteBuffer.allocate((int) srcChannel.size()); | |
282 srcChannel.read(buffer); | |
283 buffer.clear(); | |
284 return buffer; | |
285 } catch (IOException e) { | |
286 System.out.println("File not found."); | |
287 } finally { | |
288 try { | |
289 srcChannel.close(); | |
290 } catch (Exception e) { | |
291 e.printStackTrace(); | |
292 } | |
293 } | |
294 return buffer; | |
295 } | |
296 | |
297 private FileInputStream fileReader(String path) | |
298 throws FileNotFoundException { | |
299 return new FileInputStream(new File(path)); | |
300 } | |
0
df9d16620c08
Wifi broad cast test program
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
301 } |