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