kostenloser Webspace werbefrei: lima-city


Java Proxy

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    q*****4

    Hallo,

    vielleicht kann mir ja von euch jemand weiter helfen. Ich versuche gerade einen mini "Proxy" zu schreiben.

    Das Programm soll auf localhost:5000 horchen und die Daten auf localhost:22 (SSH) wieder senden.

    Ich brauche das um zwischen zwei Netzen zu vermitteln. Später wird die listen IP in einem anderen Netz sein als die write IP.
    ( :-) Also fast ein Router)

    Hier mal mein einfacher Quellcode. - Wenn ich mich per SSH Verbinde bekomme ich im moment corrupt Packages und ich weiß nicht warum ....

    //Proxy.java
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class Proxy {
    
        public static void main(String[] args) {
            try {
                ServerSocket ss = new ServerSocket(5000);
                System.out.println("Server started waiting for connection ...");
                for (;;){   //Entlosschleife
                    Socket cs = ss.accept();
                    System.out.println("Client connected");
                    System.out.println(cs.toString());
                    System.out.println("Conneting to Server ...");
                        Socket j_cs = new Socket("192.168.0.21", 22);
                        OutputStreamWriter j_out = new OutputStreamWriter(j_cs.getOutputStream());
                        InputStreamReader  j_inp  = new InputStreamReader(j_cs.getInputStream() );
                        
                        OutputStreamWriter out = new OutputStreamWriter(cs.getOutputStream());
                        InputStreamReader  inp  = new InputStreamReader(cs.getInputStream() );
                        
                        copyTh cp1 = new copyTh(inp, j_out);
                        copyTh cp2 = new copyTh(j_inp, out);
                        
                        System.out.println("Starting Thread 1");
                        cp1.start();
                        System.out.println("Starting Thread 2");
                        cp2.start();
                        
                        System.out.println("Running ...");
                        while (true){
                            if (!cp1.isAlive()){
                                break;
                            }
                            if (!cp2.isAlive()){
                                break;
                            }
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException ex) {
                            }
                        }
                        inp.close();
                        out.close();
                        j_inp.close();
                        j_out.close();
                        j_cs.close();
                }
            } catch (IOException ex) {
            }
        }
    }


    //copyTh.java
    package proxy;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class copyTh extends Thread{
        
        InputStreamReader inp;
        OutputStreamWriter wri;
        
        public copyTh(InputStreamReader inp, OutputStreamWriter wri){
            this.inp = inp;
            this.wri = wri;
        }
        
        
        @Override
        public void run(){
            while (true){
                try {
                    while (inp.ready()){
                        int i = inp.read();
                        wri.write(i);
                    }
                    wri.flush();
                } catch (IOException ex) {
                    System.out.println("Exception !!!!");
                    ex.printStackTrace();
                    break;
                }
            }
        }
    }


    Beitrag zuletzt geändert: 7.4.2012 21:53:29 von qwertz4
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    qwertz4 schrieb:
    Hier mal mein einfacher Quellcode. - Wenn ich mich per SSH Verbinde bekomme ich im moment corrupt Packages und ich weiß nicht warum ....
    Mal etwas ausgebessert:

    //Proxy.java
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class Proxy {
    
    	public static void main(String[] args) {
    		try {
    			ServerSocket ss = new ServerSocket(5000);
    			System.out.println("Server started waiting for connection ...");
    			for(;;) {   //Entlosschleife
    				Socket cs = ss.accept();
    				System.out.println("Client connected");
    				System.out.println(cs.toString());
    				System.out.println("Conneting to Server ...");
    				Socket j_cs = new Socket("localhost", 22);
    				OutputStream j_out = j_cs.getOutputStream();
    				InputStream  j_inp  = j_cs.getInputStream();
    
    				OutputStream out = cs.getOutputStream();
    				InputStream  inp  = cs.getInputStream();
    
    				copyTh cp1 = new copyTh(inp, j_out);
    				copyTh cp2 = new copyTh(j_inp, out);
    
    				System.out.println("Starting Thread 1");
    				cp1.start();
    				System.out.println("Starting Thread 2");
    				cp2.start();
    
    				System.out.println("Running ...");
    				try {
    					cp1.join();
    				} catch(InterruptedException e) { }
    				inp.close();
    				out.close();
    				j_inp.close();
    				j_out.close();
    				j_cs.close();
    				System.out.println("Connection closed");
    			}
    		} catch (IOException ex) {
    			ex.printStackTrace();
    		}
    	}
    }


    //copyTh.java
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    public class copyTh extends Thread {
    
    	InputStream inp;
    	OutputStream wri;
    
    	public copyTh(InputStream inp, OutputStream wri){
    		this.inp = inp;
    		this.wri = wri;
    	}
    
    
    	@Override
    	public void run(){
    		try {
    			int c;
    			while((c = inp.read()) != -1)
    				wri.write(c);
    			wri.flush();
    		} catch(IOException ex) {
    			System.out.println("Exception !!!!");
    			ex.printStackTrace();
    		}
    	}
    }


    Warum verwendest du unbedingt Reader? Streams sind hier viel besser geeignet und verursachen weniger Overhead.

    Auf Threads wartet man niemals in Busy-Loops, da das extrem viel CPU-Last erzeugt und dabei nichts macht als wartet. Viel besser ist hier das Warten per join.

    Im copyTh-Thread nützt die while(true)-Schleife nichts, da wenn die Verbindung verloren geht zwar eine Exception geworfen wird, das aber ignoriert wird und wieder zu lesen probiert wird, was immer fehlschlagen muss.

    Um den Server etwas stabiler zu machen könntest du die for(;;)-Schleife außerhalb des try-catch-Blocks legen. Vor der Schleife muss zwar dann das ServerSocket schon erstellt worden sein, aber der Vorteil ist, dass wen etwas bei einer Verbindung fehlschlägt der Server nicht gleich abbricht.
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!