import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; /** * A TcpTunnelGui object listens on the given port, * and once Start is pressed, will forward all bytes * to the given host and port. All traffic is displayed in a * UI. * * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com) * * Modified by Kevin Laity to remove logging textboxes which slow down the app */ public class TcpTunnelGui extends Frame { // Change this value to change the size of the text displayed in the // "listen" and "tunnel" panels of the UI. (Added by JCBeatty) int mainPanelTextSize = 14; int listenPort; String tunnelHost; int tunnelPort; TextArea listenText, tunnelText; Label status; Relay inRelay, outRelay; public TcpTunnelGui (int listenPort, String tunnelHost, int tunnelPort) { Panel p; this.listenPort = listenPort; this.tunnelHost = tunnelHost; this.tunnelPort = tunnelPort; addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent e) { System.exit (0); } }); // show info setTitle ("TCP Tunnel/Monitor: Tunneling localhost:" + listenPort + " to " + tunnelHost + ":" + tunnelPort); // labels p = new Panel (); p.setLayout (new BorderLayout ()); Label l1, l2; p.add ("West", l1 = new Label ("From localhost:" + listenPort, Label.CENTER)); p.add ("East", l2 = new Label ("From " + tunnelHost + ":" + tunnelPort, Label.CENTER)); add ("North", p); /*// the monitor part p = new Panel (); p.setLayout (new GridLayout (-1,2)); p.add (listenText = new TextArea ()); p.add (tunnelText = new TextArea ()); add ("Center", p);*/ /*// Added by JCBeatty Font mainPanelFont = new Font( "SansSerif", Font.PLAIN, mainPanelTextSize ); listenText.setFont( mainPanelFont ); tunnelText.setFont( mainPanelFont );*/ // clear and status Panel p2 = new Panel (); p2.setLayout (new BorderLayout ()); p = new Panel (); /*Button b = new Button ("Clear"); b.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { listenText.setText (""); tunnelText.setText (""); } }); p.add (b);*/ p2.add ("Center", p); p2.add ("South", status = new Label ()); add ("South", p2); pack (); show (); Font f = l1.getFont (); l1.setFont (new Font (f.getName (), Font.BOLD, f.getSize ())); l2.setFont (new Font (f.getName (), Font.BOLD, f.getSize ())); } public int getListenPort () { return listenPort; } public String getTunnelHost () { return tunnelHost; } public int getTunnelPort () { return tunnelPort; } public TextArea getListenText () { return listenText; } public TextArea getTunnelText () { return tunnelText; } public Label getStatus () { return status; } public static void main (String args[]) throws IOException { if (args.length != 3) { System.err.println ("Usage: java TcpTunnelGui listenport tunnelhost " + "tunnelport"); System.exit (1); } int listenPort = Integer.parseInt (args[0]); String tunnelHost = args[1]; int tunnelPort = Integer.parseInt (args[2]); final TcpTunnelGui ttg = new TcpTunnelGui (listenPort, tunnelHost, tunnelPort); // create the server thread Thread server = new Thread () { public void run () { ServerSocket ss = null; Label status = ttg.getStatus (); try { ss = new ServerSocket (ttg.getListenPort ()); } catch (Exception e) { e.printStackTrace (); System.exit (1); } while (true) { try { status.setText ("Listening for connections on port " + ttg.getListenPort () + " ..."); // accept the connection from my client Socket sc = ss.accept (); // connect to the thing I'm tunnelling for Socket st = new Socket (ttg.getTunnelHost (), ttg.getTunnelPort ()); status.setText ("Tunnelling port " + ttg.getListenPort () + " to port " + ttg.getTunnelPort () + " on host " + ttg.getTunnelHost () + " ..."); // relay the stuff thru new Relay (sc.getInputStream (), st.getOutputStream (), null).start ();//ttg.getListenText () new Relay (st.getInputStream (), sc.getOutputStream (), null).start ();//ttg.getTunnelText () // that's it .. they're off; now I go back to my stuff. } catch (Exception ee) { status.setText ("Ouch! [See console for details]: " + ee.getMessage ()); ee.printStackTrace (); } } } }; server.start (); } }