import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*; public class Proxy extends JFrame implements Runnable { private Thread thread = new Thread(this); private ServerSocket ss; private Socket clientSocket, serverSocket; private BufferedReader inFromClient, inFromServer; private PrintWriter outToClient, outToServer; private static int defaultPort = 9999; private JTextArea textAreaFromClient = new JTextArea(), textAreaFromServer = new JTextArea(); public static void main(String args[]) { if(args.length != 0) defaultPort = Integer.parseInt(args[0]); new Proxy(); } public Proxy() { addWindowListener(new L1()); getContentPane().setLayout(new BorderLayout()); JPanel panelAreas = new JPanel(); panelAreas.setLayout(new GridLayout(1, 2)); panelAreas.add(new JScrollPane(textAreaFromClient)); panelAreas.add(new JScrollPane(textAreaFromServer)); getContentPane().add(BorderLayout.CENTER, panelAreas); JPanel panelButtons = new JPanel(); panelButtons.setLayout(new FlowLayout()); JButton buttonClearClient = new JButton("Clear Client"); buttonClearClient.addActionListener(new L2()); panelButtons.add(buttonClearClient); JButton buttonClearServer = new JButton("Clear Server"); buttonClearServer.addActionListener(new L3()); panelButtons.add(buttonClearServer); getContentPane().add(BorderLayout.SOUTH, panelButtons); setLocation(0, 0); setSize(640, 480); show(); try { ss = new ServerSocket(defaultPort); } catch (IOException e) { System.out.println("COULD NOT LISTEN ON PORT: " + defaultPort); System.exit(1); } thread.start(); } public void run() { while(true) { try { clientSocket = ss.accept(); } catch(IOException e) { System.out.println("ACCEPT FAILED"); } handleClient(); } } private void handleClient() { System.out.println("HANDLING INCOMING CLIENT REQUEST"); try { inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); outToClient = new PrintWriter(clientSocket.getOutputStream(), true); } catch(Exception e) { System.out.println("ERROR IN GETTING STREAMS FROM CLIENT SOCKET"); } String firstLine = receive(inFromClient); textAreaFromClient.append(firstLine + "\n"); String address = getAdress(firstLine); int port = getPort(firstLine); try { System.out.println("CONNECTING TO: " + address + " AT PORT: " + port); serverSocket = new Socket(address, port); } catch(UnknownHostException uhe) { System.out.println("UNKNOWN HOST\n"); } catch(IOException ioe) { System.out.println("I/O EXCEPTION\n"); } try { inFromServer = new BufferedReader(new InputStreamReader(serverSocket.getInputStream())); outToServer = new PrintWriter(serverSocket.getOutputStream(), true); } catch(Exception e) { System.out.println("ERROR IN GETTING STREAMS FROM SERVER SOCKET"); } send(outToServer, firstLine); new MiddleHandler(inFromClient, outToServer, textAreaFromClient); new MiddleHandler(inFromServer, outToClient, textAreaFromServer); } private String receive(BufferedReader in) { String inputLine = null; try { inputLine = in.readLine(); } catch(Exception e) { System.out.println("ERROR IN RECEIVE"); } return inputLine; } private void send(PrintWriter out, String line) { try { out.println(line); } catch(Exception e) { System.out.println("ERROR IN SEND"); } } private String getAdress(String line) { // GET http://www.dn.se/ HTTP/1.0 line = line + "/"; StringTokenizer st = new StringTokenizer(line, "/"); if(st.hasMoreTokens()) st.nextToken(); if(st.hasMoreTokens()) return st.nextToken(); else return "ERROR"; } private int getPort(String line) { line = ":" + line + ":"; String stringTmp = ""; int port = 80; StringTokenizer st1 = new StringTokenizer(line, ":"); if(st1.hasMoreTokens()) st1.nextToken(); if(st1.hasMoreTokens()) st1.nextToken(); if(st1.hasMoreTokens()) { StringTokenizer st2 = new StringTokenizer(st1.nextToken(), "/"); if(st2.hasMoreTokens()) port = Integer.parseInt(st2.nextToken()); } return port; } class MiddleHandler extends Thread { BufferedReader in; PrintWriter out; JTextArea textArea; public MiddleHandler(BufferedReader in, PrintWriter out, JTextArea textArea) { this.in = in; this.out = out; this.textArea = textArea; start(); } public void run() { try { String inputLine; while((inputLine = receive(in)) != null) { textArea.append(inputLine + "\n"); send(out, inputLine); } } catch(Exception e) { System.out.println("CLOSING HANDLER"); } } } class L1 extends WindowAdapter { public void windowClosing(WindowEvent we) { dispose(); } public void windowClosed(WindowEvent we) { System.exit(1); } } class L2 implements ActionListener { public void actionPerformed(ActionEvent we) { textAreaFromClient.setText(""); } } class L3 implements ActionListener { public void actionPerformed(ActionEvent we) { textAreaFromServer.setText(""); } } }