import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.*; import java.util.*; public class TraceRoute extends JFrame { private final int SENDER_SLEEP_TIME = 1000; private final int INTERFACE_HANDLER_SLEEP_TIME = 5000; private String name, comment, host; private HashSet set = new HashSet(); private JTextArea ta = new JTextArea(); private int port = 2000; //private String address = "234.235.236.237"; private String address = "luna.dsv.su.se"; private MulticastSocket ms; public static void main(String[] args) { new TraceRoute(args[0], args[1]); } public TraceRoute(String name, String comment) { this.name = name; this.comment = comment; try { ms = new MulticastSocket(port); ms.joinGroup(InetAddress.getByName(address)); setTitle("GROUP: " + address + " JOINED AT PORT: " + port); ms.setTimeToLive(1); //ms = (DatagramSocket) ms; ms.connect(new InetSocketAddress(address, port)); } catch(IOException ioe) { System.out.println("IOException generated in ms init: " + ioe.getMessage()); } getContentPane().add("Center", new JScrollPane(ta)); addWindowListener(new L1()); setSize(640, 400); show(); new Receiver(); new Sender(); new InterfaceHandler(); } class L1 extends WindowAdapter { public void windowClosing(WindowEvent we) { try { ms.leaveGroup(InetAddress.getByName(address)); } catch(Exception e) {} dispose(); } public void windowClosed(WindowEvent we) { System.exit(1); } } // #################### Sender #################### class Sender extends Thread { public Sender() { start(); } public void run() { while(true) { try { String message = "From: " + name + " Host: " + InetAddress.getLocalHost().toString() + " Comment: " + comment; byte[] data = message.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName(address), port); ms.send(packet); sleep(SENDER_SLEEP_TIME); } catch(Exception e) {} } } } // #################### Receiver #################### class Receiver extends Thread { public Receiver() { start(); } public void run() { while(true) { String message = null; try { byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length); ms.receive(packet); message = new String(data, 0, packet.getLength()); if(!set.contains(message)) set.add(message); } catch(SocketTimeoutException ste) { System.out.println("SocketTimeoutException generated"); } catch(PortUnreachableException pue) { System.out.println("PortUnreachableException generated"); } catch(IOException ioe) { System.out.println("IOException generated"); } } } } // #################### InterfaceHandler #################### class InterfaceHandler extends Thread { public InterfaceHandler() { start(); } public void run() { while(true) { ta.setText(""); Iterator iter = set.iterator(); while(iter.hasNext()) { String message = (String)iter.next(); ta.append(getItem("From:", message) + " --- " + getItem("Host:", message) + " --- " + getItem("Comment:", message) + "\n"); } set.clear(); try { sleep(INTERFACE_HANDLER_SLEEP_TIME); } catch(Exception e) {} } } private String getItem(String item, String message) { StringTokenizer st = new StringTokenizer(message); while(!st.nextToken().equals(item)) {} return st.nextToken(); } } }