import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.lang.reflect.Array;

class PTThread extends Thread {
  Socket inSock;
  Socket outSock;
  int counter;

  PTThread(Socket i, Socket o, int c) {
    inSock=i;
    outSock=o;
    counter=c;
  }

  public void run() {
    try {
      DataInputStream SIn=new DataInputStream(inSock.getInputStream());
      BufferedOutputStream bCOut=new
        BufferedOutputStream(outSock.getOutputStream());

      int len;
      byte []buf=new byte[1024];
      while(true) {
        len=SIn.read(buf);
        bCOut.write(buf,0,len);
        bCOut.flush();
        printBin(buf,len);
      }
    }
    catch(Exception e) {
      System.out.println("closing:"+counter);
      try {
        inSock.close();
      }
      catch(Exception ex) {
      }
      try {
        outSock.close();
      }
      catch(Exception ex) {
      }
    }
  }
  public void printBin(byte [] b, int len) {
    for(int i=0;i<len;i++) {
//      System.out.print(b[i]+" ");
      System.out.print((char)b[i]);
    }
    System.out.println();
    for(int i=0;i<len;i++) {
      System.out.print(b[i]);
      System.out.print((char)b[i]);
      System.out.print(" ");
    }
    System.out.println();
  }
}

class PTServer {
  public static void main(String[] args) {
    int length=Array.getLength(args);
    if(length<3) {
      System.out.println("The syntax is:  java PTServer lPort rHost rPort");
      return;
    }
    PTServer p=new PTServer(args);
  }

  PTServer(String[] args) {
    int lport=sToI(args[0]);
    int rport=sToI(args[2]);
    int i=1;
    try {
      ServerSocket s=new ServerSocket(lport);
      while(true) {
        Socket listen=s.accept();
        Socket connect=new Socket(args[1],rport);
        System.out.println("starting "+i);
        new PTThread(listen,connect,i).start();
        new PTThread(connect,listen,i).start();
        i++;
      }
    }
    catch (Exception e) {
      System.out.println(e);
    }    
  }

  int sToI(String s) {
    try {
      return Integer.valueOf(s).intValue();
    }
    catch(Exception e) {
      return 0;
    }
  }
}

