Mercurial > hg > Members > kono > WifiBroadcast
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/uryukyu/ie/kono/wifibroadcast/WifiBroadcastTest.java Wed Nov 28 18:28:39 2018 +0900 @@ -0,0 +1,301 @@ +package jp.ac.uryukyu.ie.kono.wifibroadcast; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.LinkedList; + +public class WifiBroadcastTest { + private static int DefaultPort = 8412; + private static String MCASTADDR = "224.0.0.1"; + private static int testSize = 256; + private static long timeout = 1000; + + + LinkedList<Integer> ports = new LinkedList<Integer>(); + LinkedList<String> addresses = new LinkedList<String>(); + int count = 16; + boolean multicast = false; + boolean mchannel = false; + int receiver_count = 1; + int sender_count = 1; + WifiReceiver wbr[] = new WifiReceiver[receiver_count]; + WifiReceiver wbs[] = new WifiReceiver[sender_count]; + private boolean bchannel; + private boolean tcp; + private String nis = "en1"; + private boolean selectMode = false; + private int portIndex = 0; + private int addressIndex = 0; + + public WifiBroadcastTest() { + ports.add(0,DefaultPort); + addresses.add(0,MCASTADDR); + } + + public static void main(String args[]) { + new WifiBroadcastTest().test(args); + } + + public void test(String args[]) { + options(args); + try { + if (multicast) { + for(int i=0;i<wbr.length;i++) wbr[i] = new WifiMulticast(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Receiver); + Thread.sleep(timeout/4); + for(int i=0;i<wbs.length;i++) wbs[i] = new WifiMulticast(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Sender); + } else if (mchannel) { + for(int i=0;i<wbr.length;i++) wbr[i] = new WifiMulticastChannel(i,getAddress(i),getPort(i),nis, WifiReceiver.SocketType.Receiver); + Thread.sleep(timeout/4); + for(int i=0;i<wbs.length;i++) wbs[i] = new WifiMulticastChannel(i,getAddress(i),getPort(i),nis, WifiReceiver.SocketType.Sender); + } else if (tcp) { + addresses.remove(); addresses.add("127.1"); + for(int i=0;i<wbr.length;i++) wbr[i] = new WifiTCP(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Receiver); + Thread.sleep(timeout/4); + for(int i=0;i<wbs.length;i++) wbs[i] = new WifiTCP(i,getAddress(i),getPort(i),WifiReceiver.SocketType.Sender); + } else if (bchannel) { + for(int i=0;i<wbr.length;i++) wbr[i] = new WifiBroadcastChannel(i,getPort(i),WifiReceiver.SocketType.Receiver); + Thread.sleep(timeout/4); + for(int i=0;i<wbs.length;i++) wbs[i] = new WifiBroadcastChannel(i,getPort(i),WifiReceiver.SocketType.Sender); + } else { + for(int i=0;i<wbr.length;i++) wbr[i] = new WifiBroadcast(i,getPort(i),WifiReceiver.SocketType.Receiver); + Thread.sleep(timeout/4); + for(int i=0;i<wbs.length;i++) wbs[i] = new WifiBroadcast(i,getPort(i),WifiReceiver.SocketType.Sender); + } + } catch (IOException e) { + System.err.println("err "+e); + } catch (InterruptedException e) { + System.err.println("err "+e); + } + runTest(count, wbr, wbs); + + } + + private String getAddress(int i) { + return addresses.get(i%addresses.size()); + } + + private int getPort(int i) { + return ports.get(i%ports.size()); + } + + public void options(String[] args) { + for(int i=0;i<args.length;i++) { + switch(args[i]) { + case "-m": multicast = true; break; + case "-channel": mchannel = true; break; + case "-bchannel": bchannel = true; break; + case "-tcp": tcp = true; break; + case "-r": i++; receiver_count = getOptInt(args, receiver_count, i); wbr = new WifiReceiver[receiver_count]; break; + case "-s": i++; sender_count = getOptInt(args, sender_count, i); wbs = new WifiReceiver[sender_count]; break; + case "-c": i++; count = getOptInt(args, count, i); break; + case "-t": i++; timeout = getOptInt(args, (int) timeout, i); break; + case "-T": i++; testSize = getOptInt(args, testSize, i); break; + case "-n": i++; nis = getOptString(args, nis, i); break; + case "-p": i++; setPort(args,i); break; + case "-a": i++; setAddress(args, i); break; + case "-select": i++; selectMode = true; break; + default: i++; + System.out.println( + "(default) Broadcast DatagramSocket\n"+ + "-m Multicast DatagramSocket\n"+ + "-cahnnel Multicast with DatagramChannel\n"+ + "-bcahnnel Broadcase with DatagramChannel\n"+ + "-tcp TCP stream\n"+ + "-r N create N receivers\n"+ + "-s N create N senders\n"+ + "-c N send count packet\n"+ + "-t N timeout N msec\n"+ + "-T N send N byte packet\n"+ + "-n en1 Network Interface name for multicast (default en1)\n"+ + "-p N broadcast/multicast port\n"+ + "-a S broadcast/multicast address\n"+ + "-select use select for timeout\n"+ + "-h print this\n"+ + "" + ); + return; + } + } + } + + + + + public void runTest(int count, WifiReceiver[] wbr, WifiReceiver wbs[]) { + Thread t = timeouter(); + Thread send[] = new Thread[wbs.length]; + int id = 0; + for(WifiReceiver s:wbs) { + send[id]= sender(s,count); + id ++; + } + id = 0; + Thread recv[] = new Thread[wbr.length]; + for(WifiReceiver r: wbr) { + recv[id] = receiver(r,id, count, timeout); + id ++; + } + try { + for(int i = 0;i<wbr.length;i++) { + recv[i].join(); + } + for(int i = 0;i<wbs.length;i++) { + send[i].join(); + } + t.join(); + } catch (InterruptedException e) { + } + } + + + + public int getOptInt(String[] args, int count, int i) { + if (i<args.length) { count = Integer.parseInt(args[i]); } + return count; + } + + public String getOptString(String[] args, String str, int i) { + if (i<args.length) { str = args[i]; } + return str; + } + + private void setAddress(String[] args, int i) { + String adr = getOptString(args,addresses.get(0),i); + int p; + if ((p=adr.indexOf(":"))>0) { + String sp = adr.substring(p+1); + adr = adr.substring(0,p-1); + portIndex = addressIndex; + if (ports.size()>portIndex) ports.remove(portIndex); + ports.add(portIndex,Integer.parseInt(sp)); + portIndex ++; + } + if (addresses.size()>addressIndex) addresses.remove(addressIndex); + addresses.add(addressIndex,adr); + addressIndex++; + } + + private void setPort(String[] args, int i) { + String sport = getOptString(args,"0", i); + if (ports.size()>portIndex) ports.remove(portIndex); + ports.add(portIndex,Integer.parseInt(sport)); + portIndex++; + } + + public Thread sender(final WifiReceiver wbs, final int count) { + wbs.selectMode(selectMode); + Runnable sender = new Runnable() { + + @Override + public void run() { +// ByteBuffer testData = getTestData(testSize); + ByteBuffer testData = readTestData(); + int i = 0; + try { + Thread.sleep(timeout); + for(i = 0; i<count;i++) { + testData.putInt(0, i); + wbs.send(testData); + testData.flip(); + } + } catch (Exception e) { + System.err.println("sender error at "+i+" "+e); + } + } + }; + Thread s = new Thread(sender); + s.start(); + return s; + } + + private boolean running; + + public Thread timeouter() { + running = true; + Runnable timeouter = new Runnable() { + @Override + public void run() { + try { + Thread.sleep(30*1000); + } catch (InterruptedException e) { + } + running = false; + } + }; + Thread t = new Thread(timeouter); t.start(); + return t; + } + + public Thread receiver(final WifiReceiver wbr, final int id, final int count, final long timeout) { + wbr.selectMode(selectMode); + Runnable receiver = new Runnable() { + @Override + public void run() { + ByteBuffer testData = ByteBuffer.allocate(4096); + int bad = 0, good = 0; + try { + for(int i = 0; running && i<count;i++) { + testData.clear(); + wbr.recieve(testData,timeout); + if (!testData.hasRemaining()) continue; + System.out.println("receive id"+id+":"+testData.remaining()+" bytes."); + int seq = testData.getInt(); + if (seq!=i) { + bad++; i = seq; + } else { + good++; + } + } + } catch (Exception e) { + System.err.println("receiver error "+e); + } + System.out.println("get "+good+" packets, "+bad+" losts."); + } + }; + Thread r = new Thread(receiver); r.start(); + return r; + } + + public ByteBuffer getTestData(int i) { + ByteBuffer b = ByteBuffer.allocate(i); + b.putInt(0); + for(int j = 0; j<256; j++ ) { + b.put((byte)j); + if (! b.hasRemaining()) break; + if (j == 255) j=0; + } + b.flip(); + return b; + } + + public ByteBuffer readTestData() { + FileChannel srcChannel = null; + String path = "./testfile.txt"; + ByteBuffer buffer = null; + try { + srcChannel = fileReader(path).getChannel(); + buffer = ByteBuffer.allocate((int) srcChannel.size()); + srcChannel.read(buffer); + buffer.clear(); + return buffer; + } catch (IOException e) { + System.out.println("File not found."); + } finally { + try { + srcChannel.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return buffer; + } + + private FileInputStream fileReader(String path) + throws FileNotFoundException { + return new FileInputStream(new File(path)); + } +}