diff options
Diffstat (limited to 'tests/TestNetSwing.java')
-rw-r--r-- | tests/TestNetSwing.java | 189 |
1 files changed, 81 insertions, 108 deletions
diff --git a/tests/TestNetSwing.java b/tests/TestNetSwing.java index 3154457..7afbb0a 100644 --- a/tests/TestNetSwing.java +++ b/tests/TestNetSwing.java @@ -1,25 +1,29 @@ /** * TestNetSwing , a network Ivy domain checker. * @author Yannick Jestin <mailto:jestin@cena.fr> + * * (c) CENA - * A simple Swing application in order to check whether the chosen network is - * OK + * A simple Swing application in order to check a network + * + * Changelog: + * 1.2.8 + * - apache regexp instead of gnu regexp */ import java.net.*; import java.io.*; import java.util.*; -import gnu.regexp.*; -import gnu.getopt.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; +import fr.dgac.ivy.*; +import org.apache.regexp.*; +import gnu.getopt.*; class TestNetSwing implements Runnable { private JFrame frame; private JLabel receive; private JButton send; - private JComboBox domainBox; private int alpha=0; private Color color; private static int FADINGSTEP = 20; @@ -31,59 +35,33 @@ class TestNetSwing implements Runnable { private static Color DEFAULT_COLOR = new Color(DEFAULT_RED,DEFAULT_GREEN,DEFAULT_BLUE,DEFAULT_ALPHA); - private static String[] domainList = { - "127.255.255.255:2010", - "10.0.0.255:2010", - "10.192.36.255:2010", - "227.1.2.3:4567" - }; - - private Thread server; private Ageing age; - private String domain; + private String domainAddr="none"; + private int port=0; + private int serial=1; private boolean watcherrunning = false; + private volatile Thread watcherThread; private boolean isMulticastAddress = false; private Thread broadcastListener ; private DatagramSocket broadcast; /* supervision socket */ // it can also be a MulticastSocket, which inherits from the previous - public TestNetSwing(String d) { - if (d==null) { d = domainList[0]; }; - domain=d; - server = createBroadcastListener(domain); - server.start(); - frame = new JFrame("TestNet"); - frame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - System.exit(0); - } - }); + public TestNetSwing(String da,int p) { + this.domainAddr=da; + this.port=p; + createBroadcastListener(); + frame = new JFrame("TestNet "+domainAddr+":"+port); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container cp = frame.getContentPane(); cp.setLayout(new GridLayout(0,1)); - cp.add(send = new JButton("send packet")); + cp.add(send = new JButton("send packet to "+domainAddr+":"+port)); send.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { - send("hello",domain); + send("hello",domainAddr,port); } }); cp.add(receive = new JLabel("")); - domainBox = new JComboBox(); - domainBox.setEditable(true); boolean sel = false; - int index=0; - for (;index<domainList.length;index++) { - domainBox.addItem(domainList[index]); - if (domainList[index]==d) { - domainBox.setSelectedIndex(index); - sel=true; - } - } - if (!sel) { - domainBox.addItem(domain); - domainBox.setSelectedIndex(index); - } - cp.add(domainBox); - domainBox.addActionListener(new ComboCB()); frame.pack(); age=new Ageing(); frame.setVisible(true); @@ -91,21 +69,21 @@ class TestNetSwing implements Runnable { public void run() { byte buf[] = new byte[256]; + Thread thisThread=Thread.currentThread(); for (int i=0;i<buf.length;i++) { buf[i]=10; } DatagramPacket packet=new DatagramPacket(buf, 256); - int port; - String s = "Server waiting for Broadcast on "+domain; + String s = "Server waiting for Broadcast on "+domainAddr+":"+port; s+=(isMulticastAddress)?" (TCP multicast)":" (UDP broadcast)"; System.out.println(s); - while( watcherrunning ) try { + while( watcherThread==thisThread) try { broadcast.receive(packet); String msg = new String(buf) ; // clean up the buffer after each message for (int i=0;i<buf.length;i++) { buf[i]=10; } InetAddress remotehost = packet.getAddress(); - updateLabel(remotehost.getHostName()+":"+msg); + updateLabel("("+(serial++)+") "+ remotehost.getHostName()+":"+msg); } catch (java.io.InterruptedIOException jii ){ - if (!watcherrunning) break; + if (watcherThread!=thisThread) break; } catch (java.io.IOException ioe ){ System.err.println("IvyWatcher IOException "+ ioe.getMessage() ); } @@ -113,7 +91,11 @@ class TestNetSwing implements Runnable { System.out.println("Server normal shutdown"); } - void stop() { watcherrunning=false; } + synchronized void stop() { + Thread t = watcherThread; + watcherThread = null; + if (t!=null) { t.interrupt(); } + } private void updateLabel(String text) { if (text==null) return; @@ -125,39 +107,10 @@ class TestNetSwing implements Runnable { receive.setForeground(color); } - private static String getDomain(String net) { - int sep_index = net.lastIndexOf( ":" ); - if ( sep_index != -1 ) { net = net.substring(0,sep_index); } - try { - net += ".255.255.255"; - RE exp = new RE( "^(\\d+\\.\\d+\\.\\d+\\.\\d+).*"); - net = exp.substitute( net , "$1" ); - } catch ( REException e ){ - System.out.println("Bad broascat addr " + net); - return null; - } - //System.out.println("net: "+net); - return net; - } - - private static int getPort(String net) { - int port; - int sep_index = net.lastIndexOf( ":" ); - if ( sep_index == -1 ) { - port = -1; - } else { - port = Integer.parseInt( net.substring( sep_index +1 )); - } - //System.out.println("port: "+port); - return port; - } - - private static void send(String data, String net) { - int port = getPort(net); - net=getDomain(net); + private static void send(String data, String domain,int port) { try { DatagramSocket send; - InetAddress group = InetAddress.getByName(net); + InetAddress group = InetAddress.getByName(domain); send = new MulticastSocket(port); if (group.isMulticastAddress()) { ((MulticastSocket)send).joinGroup(group); } DatagramPacket packet = new DatagramPacket( @@ -174,31 +127,28 @@ class TestNetSwing implements Runnable { } } - private Thread createBroadcastListener(String domain) { - String domainaddr=getDomain(domain); - int port=getPort(domain); - this.domain=domainaddr+":"+port; + private void createBroadcastListener() { try { - InetAddress group = InetAddress.getByName(domainaddr); + InetAddress group = InetAddress.getByName(domainAddr); if (group.isMulticastAddress()) { isMulticastAddress = true; - broadcast = new MulticastSocket(port ); // create the UDP socket + broadcast = new MulticastSocket(port); // create the UDP socket ((MulticastSocket)broadcast).joinGroup(group); } else { - broadcast = new MulticastSocket(port ); // create the UDP socket + broadcast = new MulticastSocket(port); // create the UDP socket } } catch ( IOException e ) { System.out.println("MulticastSocket I/O error" + e ); - return null; + e.printStackTrace(); + System.exit(0); } try { - broadcast.setSoTimeout(100); + broadcast.setSoTimeout(Ivy.TIMEOUTLENGTH); } catch ( java.net.SocketException jns ) { System.out.println("IvyWatcher setSoTimeout error" + jns.getMessage() ); } - // starts a Thread listening on the socket - watcherrunning=true; - return new Thread(this); + watcherThread = new Thread(this); + watcherThread.start(); } private class Ageing implements Runnable { @@ -225,35 +175,58 @@ class TestNetSwing implements Runnable { public void stop(){ encore=false; } } - private class ComboCB implements ActionListener { - public void actionPerformed(ActionEvent e) { - String newDomain=(String)domainBox.getSelectedItem(); - System.out.println("coucou "+ domainBox.getEditor().getItem()); - // if it's the same domain, don't do anything - if (newDomain == domain) { return; } - domain=newDomain; - watcherrunning=false; - server.stop(); - server = createBroadcastListener(domain); - server.start(); + /* + * copied verbatim from IvyWatcher , I should put TestNetSwing *in* the + * distribution itself ... + */ + static String getDomain(String net) throws IvyException { + // System.out.println("debug: net=[" + net+ "]"); + int sep_index = net.lastIndexOf( ":" ); + if ( sep_index != -1 ) { net = net.substring(0,sep_index); } + try { + RE numbersPoint = new RE("([0-9]|\\.)+"); + if (!numbersPoint.match(net)) { + // traceDebug("should only have numbers and point ? I won't add anything... " + net); + return net; + } + net += ".255.255.255"; + RE exp = new RE( "^(\\d+\\.\\d+\\.\\d+\\.\\d+).*"); + if (!exp.match(net)) { + System.out.println("Bad broascat addr " + net); + throw new IvyException("bad broadcast addr"); + } + net=exp.getParen(1); + } catch ( RESyntaxException e ){ + System.out.println(e); + System.exit(0); } - } // ComboCB + // System.out.println("debug: returning net=[" + net+ "]"); + return net; + } + + static int getPort(String net) { // returns 0 if no port is set + int sep_index = net.lastIndexOf( ":" ); + int port= ( sep_index == -1 ) ? 0 :Integer.parseInt( net.substring( sep_index +1 )); + // System.out.println("net: ["+net+"]\nsep_index: "+sep_index+"\nport: "+port); + return port; + } + public static final String helpmsg = "usage: java TestNetSwing [options]\n\t-b BUS\tspecifies the Ivy bus domain\n\t-h\thelp\n\n"; - public static void main(String[] args) { + public static void main(String[] args) throws IvyException { Getopt opt = new Getopt("TestNetSwing",args,"b:h"); - String domain = null; int c; + String domainstring = Ivy.getDomain(null); while ((c = opt.getopt()) != -1) switch (c) { case 'b': - domain=opt.getOptarg(); + domainstring=opt.getOptarg(); break; case 'h': default: System.out.println(helpmsg); System.exit(0); } // getopt - new TestNetSwing(domain); + new TestNetSwing(getDomain(domainstring),getPort(domainstring)); } } // class TestNetSwing |