1 package org.wamblee.socketproxy;
4 * Created on Apr 5, 2005
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.net.ServerSocket;
11 import java.net.Socket;
16 * TODO To change the template for this generated type comment go to Window -
17 * Preferences - Java - Code Style - Code Templates
19 * @author Erik Brakkee
21 public class SocketProxy {
23 public static void main( final String[] args ) throws IOException {
24 for ( int i = 0; i < args.length; i++ ) {
25 // System.out.println(i + " " + args[i]);
26 String[] fields = args[i].split( ":" );
27 final int localPort = Integer.parseInt( fields[0] );
28 final String host = fields[1];
29 final int remotePort = Integer.parseInt( fields[2] );
30 runSocketProxy( localPort, host, remotePort );
39 private static void runSocketProxy( final int localPort,
40 final String host, final int remotePort ) {
41 new Thread( new Runnable( ) {
44 new SocketProxy( localPort, host, remotePort );
45 } catch ( IOException e ) {
46 System.out.println( "Problem with socket " + localPort
47 + ":" + host + ":" + remotePort );
54 public SocketProxy( int localPort, String remoteHost, int remotePort )
56 System.out.println( "Listening on port " + localPort );
57 ServerSocket server = new ServerSocket( localPort );
59 Socket socket = server.accept( );
60 System.out.println( "Got local connection on port "
62 InputStream localIs = socket.getInputStream( );
63 OutputStream localOs = socket.getOutputStream( );
64 Socket clientSocket = new Socket( remoteHost, remotePort );
65 final String description = "Port forwarding: " + localPort
66 + " -> " + remoteHost + ":" + remotePort;
67 System.out.println( description + " established." );
68 InputStream serverIs = clientSocket.getInputStream( );
69 OutputStream serverOs = clientSocket.getOutputStream( );
70 Barrier barrier = new Barrier(2);
71 final Thread t1 = runForwarder( barrier, "> ", localIs, serverOs );
72 final Thread t2 = runForwarder( barrier, "< ", serverIs, localOs );
73 waitForConnectionClose( description, t1, t2 );
82 private void waitForConnectionClose( final String description,
83 final Thread t1, final Thread t2 ) {
84 new Thread( new Runnable( ) {
89 } catch ( InterruptedException e ) {
92 System.out.println( description + " closed" );
97 private Thread runForwarder( final Barrier barrier, final String prefix,
98 final InputStream is, final OutputStream os ) {
99 Thread t = new ForwarderThread(prefix, barrier, is, os);