title: Creating Java Proxy MITM
body: <p>I'm trying to create a Java program as a proxy to view packets from an incoming source to debug. To do this, I have created a simple Java server application and have edited my host file on the device. Everything works fine as of now, (even my Relay class file) but I am trying to make it into a full fledged proxy. How could I incorporate elements to send data to the server, and send the response back to the client? Sort of like a Man-In-The-Middle type of thing.</p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  import org.ini4j.Ini;
  
  public class RelayMultiClient extends Thread {
      private Socket socket = null;
      Socket relay = null;
  
      public RelayMultiClient(Socket socket) {
      super("RelayMultiClient");
      this.socket = socket;
      }
  
      public void run() {
  
      try {
          PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
          BufferedReader in = new BufferedReader(
                      new InputStreamReader(
                      socket.getInputStream()));
          if(Relay.max_clients == Relay.connected_clients) {
              //There are too many clients on the server.
              System.out.println("Connection refused from " + socket.getRemoteSocketAddress() + ": Too many clients connected!");
              out.close();
              in.close();
              socket.close();
          }
          else {
              Ini ini = new Ini(new File("settings.ini"));
              Relay.connected_clients++;
              System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " established. Clients Connected: " + Relay.connected_clients);
              while (in.readLine() != null) {
                  //Send data to the server
                  //Receive data from server and send back to client
              }
              System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " lost.");
              Relay.connected_clients--;
              out.close();
              in.close();
              socket.close();
          }
      } catch (IOException e) {
          e.printStackTrace();
      }
      }
  }
  </code></pre>
  
  <p>Thanks,
  Chris</p>
  
  <p>P.S: I'm not attempting to get HTTP data, I am trying to get data from a game I have created. I don't know if this type of data requires any extra handling.</p>