# Einfacher Proxy-Server



## learner (26. Dez 2009)

Hi,

ich versuche gerade, mir einen kleinen Proxy-Server zu basteln. Dazu habe ich jetzt schon jegliche gefundenen Code-Beispiele aus dem Netz getestet, aber irgendwie habe ich mit allen meine Probleme:
Ich möchte auf einem festgelegten Port einen Proxy-Server errichten. Surft der Browser über diesen Port, soll der Java-Proxy den kompletten Inhalt abfangen und weiterleiten. Grund: Ich möchte alle Bilder der Seite extrahieren.

Mein Problem ist, dass es i.d.R. mit einer Seite geht, wenn ich dann aber weitersurfen möchte, wird wieder die gleiche Seite besucht.
Kennt jemand vllt. ein gutes (und möglichst schnelles) Beispiel für einen kleinen Proxy-Server?


----------



## Gast2 (26. Dez 2009)

wieso baust Du Dir nicht gleichen einen rekursiven Grabber?


----------



## learner (26. Dez 2009)

Den Sourcecode auslesen?
Ich würde mich (bzgl. weiterer Ideen, die ich noch habe) eher für den Proxy interessieren...


----------



## Gast2 (26. Dez 2009)

ach stimmt ... das Parsen übernimmt ja der Browser und fordert das Bild an - das braucht ja nur noch umgeleitet werden


----------



## learner (27. Dez 2009)

... ja, aber genau da steckt ja das Problem.
Mein jetziger Code ist an dieses Bsp. angelehnt: A simple single-threaded proxy server : SSL Server SocketNetwork ProtocolJava

Das Einzige, was ich abgeändert habe: mein Code arbeitet nicht über Parameter, sondern liest den HostName des Servers direkt aus dem Request des Clients.
Zusammengefasst: ich habe für jeden Request des Clients einen Thread, der den Request an den Server weiterleitet und den eingehenden Traffic vom Server an den Client weitergibt. Soweit so gut, das funktioniert auch. Das Problem ist jedoch, dass ich - aus mir absolut nicht nicht ersichtlichen Gründen - immer nur eine Seite besuchen kann. Obwohl (ich lasse mir über println den jeweilgen Request ausgeben) die Requests eindeutig auf eine andere Seite verweisen, wird mir stets immer nur die erste angegebene Domain geöffnet.

Irgendeine Idee?


----------



## learner (27. Dez 2009)

Okay... jetzt bin ich etwas schlauer:

Es liegt am "keep-alive". Auf jeden Fall wird meine Funktion, die die Sockets schließen soll, nie erreicht, weil er beim 'read' des InputStreams hängen bleibt. Damit nimmt der darauf folgende Thread seltsamerweise den gleichen Server wieder auf.

Allerdings funktioniert socket.setKeepAlive(false); nicht wirklich. Also habe ich es mit einem Timeout versucht... jedoch mit der wirklich grandiosen Folge, dass er meine read-Funktion abbricht, obwohl er noch fleißig am Lesen ist. Langsam habe ich keine Haare mehr auf dem Kopf...


----------



## noxan (27. Dez 2009)

Ich hab mir auch mal einen relativ primitiven Proxy programmiert ... hab mir damals auch aus dem HTTP-Header den "HostName" ausgelesen und diese dann mit URL und URLConnection geöffnet:

```
URL url = new URL(request.getUri());
URLConnection con = url.openConnection();
byte[] buffer = new byte[BUFFER_SIZE]; 
InputStream in = con.getInputStream();

int len = in.read(buffer, 0, BUFFER_SIZE);
while(len!=-1) {
	out.write(buffer, 0, len);
	len = in.read(buffer, 0, BUFFER_SIZE);
}
in.close();
```

Könntest vielleicht auch mal so probieren ... sonst kann ich ohne Quelltext schlecht sagen warum es bei dir nicht funktionieren will...


----------

