2013-05-08 11 views
12

Ich muss eine HTTP-Proxy-Server-Anwendung implementieren, die Anforderungen von mehreren Clients an einen Remote-Server Proxy wird.Java-HTTP-Proxy-Server

Hier sind die Schritte:

  1. Client-Vorwärts-Anfrage an den Proxy
  2. Proxy Vorwärts-Anfrage an den Server
  3. Server kehrt zu Proxy anfordern
  4. Proxy kehrt zum Client-Anfrage.

Ich bin nur nicht sicher, wie ich diesen Proxy implementieren sollte. Mein erster Gedanke war, eine Tomcat-Anwendung zu implementieren, die jersey/apache httpclient verwendet, um die Anfrage an den Remote-Server weiterzuleiten und die Antwort zurück an den Client zu senden?

Gibt es eine bessere Möglichkeit, einen solchen Proxy-Server zu implementieren?

Der Proxy müsste mehrere Threads verarbeiten.

Antwort

9

Sie können es nicht als Servlet implementieren, und es gibt keinen Grund, irgendeine Form von HTTP-Client zu verwenden.

Ein gesichts Proxy-Server ist eine wirklich einfache Sache:

  1. eine Verbindung annehmen und einen Thread für sie starten.
  2. Lesen Sie die Anfrage vom Client bis zur Leerzeile.
  3. Extrahieren Sie den Befehl GET oder CONNECT oder was auch immer es ist, und stellen Sie eine Verbindung zum benannten Host her.
  4. Wenn das fehlschlägt, senden Sie eine entsprechende HTTP-Fehlerantwort zurück, schließen Sie den Socket und vergessen Sie es.
  5. Andernfalls starten Sie zwei Threads zum Kopieren von Bytes, eins in jede Richtung. Nichts Besonderes, nur

    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    
  6. Wenn einer dieser Sockel eine EOS liest, shutdown die andere Buchse für die Ausgabe und den Thread beenden, die die EOS bekam.
  7. Wenn der Socket, der die EOS-Quelle war, bereits für die Ausgabe heruntergefahren wurde, schließen Sie beide.

Oder verwenden Sie Apache SQUID.

8

Auschecken LittleProxy - es hat integrierte Klassen für eingehende und ausgehende Anfragen; Sie können Ihren Code einfach so schreiben, wie Sie eine HTTP-Anfrage in einem Servlet behandeln würden.

+0

Und ja, es hat eingebaute CONNECT-Unterstützung, die nicht wirklich in die Servlet-APIs eingebaut ist –