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