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));
+	}
+}