# Socket- Connection über einen SOCKS-Proxy mit JAVA



## lukelukeluke (28. Juli 2006)

Hallo Leute,
normalerweise beginne ich so eine Socket-Verbindung, also verbinde mich gleich im Konstruktor der Klasse Socket:
*Socket socket = new Socket("domain.com",5963);*
Das hat bis jetzt immer funktioniert. Nun möchte ich diese Verbindung über einen Proxy-Server herstellen.
Überall im Internet (z.B. hier: http://java.sun.com/j2se/1.5.0/docs/guide/net/proxies.html) kann man folgenden Code dafür finden:

```
SocketAddress addr = new InetSocketAddress("proxydomain.com",80);
Proxy proxy = new Proxy(Proxy.Type.SOCKS,addr);
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("domain.com",5963);
socket.connect(dest);
```
Wieso geht dieser Code bei mir nicht? Es kommt immer ein Fehler, dass *Proxy.Type.SOCKS* nicht erkannt wird.
Hat jeamnd schon erfolgreich eine Socket Verbindung über einen Proxy gemacht? Evtl. auch mit Username und Passwort Übermittlung?
Danke für eure Hilfe!


----------



## MeinerEiner_80 (28. Juli 2006)

Moin!
Kurze Frage, hast du auch java 1.5? *Proxy.Type.SOCKS *gibt es nämlich erst seit da

*grüssle*
MeinerEiner


----------



## lukelukeluke (28. Juli 2006)

Hallo MeinerEiner,
Ich habe Java 1.4.x, sieht also schlecht aus... .
Gibt es eine andere Möglichkeit eine Socket-Verbindung über einen Proxy zu machen?
Gruss, Luke


----------



## MeinerEiner_80 (28. Juli 2006)

Moin!
Probiere mal folgendes:

```
System.getProperties().put( "proxySet", "true" );
 System.getProperties().put( "proxyHost", "yourProxyMachineName" );
 System.getProperties().put( "proxyPort", "yourProxyPort" );
```


Das funktioniert bei mir, wenn ich eine HttpURLConnection über einen Proxy mache möchte. Ob das auch in der tieferen Socket Schicht funktioniert, bin ich überfragt.. teste es einfach mal aus!

*grüssle*
MeinerEiner


----------



## lukelukeluke (28. Juli 2006)

Hallo MeinerEiner,
Danke für deine erneute Antwort!
Mit diesem Trick "funktioniert" es schon eher. Ich kann nun das Programm kompilieren wenn ich vor dem Socketaufbau diese Werte setze...
Jedoch fragt er mich nicht nach Username und Passwort per Standard-Windows Fenster. Gibt es eine Möglichkeit diese mit JAVA zu setzen? Weil der Proxy braucht eine Benutzerauthentifizierung.
Danke für deine Hilfe!


----------



## MeinerEiner_80 (28. Juli 2006)

Moin!
hmm.. ich glaub das war etwas derart..:

```
System.getProperties.put( "http.proxyUser", "yourUsername" )
System.getProperties.put( "http.proxyPassword", "yourPassword" );
```

*grüssle*
MeinerEiner


----------



## lukelukeluke (28. Juli 2006)

Hmm, das bringt irgendwie nicht mehr, wenn ich das unten angebe.
Hier ist mein Code:

```
System.setProperty( "proxySet", "true" );
System.setProperty( "proxyHost", "70.42.124.12" );
System.setProperty( "proxyPort", "80" );
try {
    System.out.println("Socket start");
    socket = new Socket("server.com",4526);
    System.out.println("Socket up");
```
(Die IP ist erfunden)

Da ich den Proxy besitze kann ich in der Logdatei nachsehen. Wenn ich nun einen Webbrowser öffne und folgenden Link aufrufe: http://70.42.124.12, dann zeigt es mir zwar eine Fehlermeldung an. Jedoch steht dann in dem Logfile vom Proxy eine weitere Zeile, dass jemand "nicht authorisierter" versucht hat, den Proxy zu verwenden.
Mit diesem oben angezeigten Java-Code (erstmal ohne "http.proxyUser" und "http.proxyPassword" zu setzen) wird nicht einmal eine Zeile zum Proxy Log hinzugefügt. Ich kann also mit Java denn proxy gar nicht errecihen, bzw. es kommt eine Timeout-Fehlermeldung und "Socket up" wird nie angezeigt...


----------



## Thomas Darimont (28. Juli 2006)

Hallo!

Wenn du einen SOCKS Proxy verwendest musst du auch das socksProxyHost und socksProxyPort (default: 1080) System Property setzen.

Gruß Tom


----------



## lukelukeluke (29. Juli 2006)

Also... ich habe glaube ich gar keinen SOCKS Proxy, sondern einen Squid www-proxy (müsste ein http Proxy sein?). Jedoch geht es auch nicht mit *"http.proxyHost"*...
Gibt es eine Möglichkeit mit Java den Proxy zu testen?


----------



## SaintOliver (16. Januar 2008)

Hi Leute, habe da mal eine Frage an die Expertenrunde...

Ich verwende eine verschlüsselte SSLSocket Verbindung um zwischen einem Client und einem Server zu kommunizieren. Nun soll die Verbindung zusätzlich über einen Proxy laufen. Alle direkte Internetverbindungen sind geschlossen und der einzige Ausgang ist über den Proxy. Den Code den ich für die direkte Verbindung verwende sieht einigermaßen so aus:


```
SSLSocketFactory sf = getMySSLContext().getSocketFactory();
			ss = (SSLSocket) sf.createSocket(dest, destport);
			ss.startHandshake();
```

Gibt es da besondere Anforderungen, die der Proxy erfüllen muss, um die SSL Verbindung weiterleiten zu können? Was muss ich wie einstellen, damit der Proxy verwendet wird?

Vielen Dank für Eure Hilfe...

Gruß
SaintOliver


----------



## SaintOliver (17. Januar 2008)

Keiner eine Idee


----------



## StehtimSchilf (12. März 2009)

Nun hat's mich auch hier erwischt.

Ich muss eine bestehende Klasse anpassen, damit diese über einen Proxy geht. Die Klasse benutzt jedoch java.net.Socket und nicht  HttpURLConnection.

Hier ein Test-Schnippel:



```
// der zu kontaktierende Host
String host = "soap.schnipschnap.de";
int port = 80;

// unser Proxy
String proxyHost = "192.168.13.42";
int proxyPort = 8080;

// put properties
System.setProperty("socksProxyPort", proxyHost);
System.setProperty("socksProxyHost", String.valueOf(proxyPort));

// set up proxy
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort));

// set up socket
socket = new Socket(proxy);

// contact host
socket.connect(new InetSocketAddress(host, port));
```

nun bleibt die Appli bei socket.connect() hängen.
Der Proxy (Es ist ein ISA Webproxy für HTTP) funktioniert, denn ich schreibe diesen Beitrag via obigen Proxy.

Proxy.Type.HTTP
habe ich auch schon versucht, doch dann erhalte ich:
java.lang.IllegalArgumentException: Invalid Proxy

es kann doch wirklich nicht so schwer sein?

cheerioh
SiS

BTW: umprogrammieren auf HTTPUrlConnection() is nicht.............


----------



## elmelm (10. Juni 2013)

Hallo zusammen,
Hallo zusammen,
ich bin rech neu in Java und arbeite an einer Client-Server-Applikation, die Bereits besteht.

Bei Direktverbindung wird bisher eine normale Socketverbindung zu Ausgewählter IP und Port aufgebaut.

Arbeite mit JRE 1.6.

Gewünscht ist nun, das wir durch proxies gut durchkommen. 
Am Besten wäre es, wenn die vorherige SOCKET-Verbindung über die normale http oder https Verdingung "durchgeschleust" werden könnte.

Ich vermute jedoch das dies so einfach nicht geht.

Habt ihr ideen oder praktikable Alternativen?

Wenn dies nicht geht würde mir erstmal auch eine SOCKS-Serververbindung weiterhelfen. Diese funktioniert bei mir arber bisher auch nicht.
Ich glaube ich habe die Zusammenhänge der Socket, SOCKs, Proxy etc Verbindung noch nicht verstanden-.

Bevor ich das komplette Problem beschreibe wollte ich fragen ob mir wer sagen kann ob mein obiger Vorschlag geht, Sinn macht bzw was die alternativen sind.

Danke für eure Antworten schon mal.


----------



## elmelm (10. Juni 2013)

Ok dann werd ich das mal weiter ausführen.

Bisher wird eine einfache Verbindung über:
java.net.Socket socket = new java.net.Socket(ip,port);

Aufgebaut.

Da ich vermute das es erstmal(am einfachsten) nur über SOCKS-proxy geht, da hier auch niemand was anderes geschrieben hat. Habe ich mal mit SOCKs rumprobiert.

Da ich mir nicht sicher bin wie die Zusammenhänge mit socket und SOCKS-Proxy Verbindung bin habe ich testweise einen proxy ohne authentifizierung aufgebaut um meine SW zu testen.

Mein Ansatz war nun:
 System.setProperty("socksProxyHost", "xxx.xxx.xxx.xxx");
 System.setProperty("socksProxyPort", "1080");

direkt vor dem Verbindungsaufbau mit dem Socket zu verwenden.

Aber irgendwie geht das nicht.

Weis da jemad was?

Danke!


----------



## slowfly (10. Juni 2013)

Steht ja alles obedran. Wo hast du denn Probleme?

_Ich vermute jedoch das dies so einfach nicht geht._
Doch, das ist ganz einfach ;-) - jedenfalls wenn man's wenigstens einmal hinbekommen hat 

System properties setzen für http.proxyHost, http.proxyPort, gleiches für https. Wenn der Proxy eine Passwortabfrage hat, kannste noch http.proxyUser und http.proxyPassword setzen, wobei es Sinn machen kann, solche Applikationen ohne Abfrage nur auf bestimmte Seiten zu lassen. Wir setzten diese Parameter beim Start der VM als VM-Arguments (-Dhttp...), damit das nirgends im Code gesetzt werden muss.

Dazu gibt es noch nonProxyHost, dort ist bei uns *.firma.ch drin - weil Connects zu unseren Seiten ja nicht über den Proxy "ins Internet" müssen...

Gruss,
slowy


----------



## elmelm (10. Juni 2013)

Ok kann man also einfach eine 
Socketverbindung mit z.B.
java.net.Socket socket = new java.net.Socket(ip,port);

mit einer Http Verbindung aufbauen, oder muss man dann den Code umschreiben?

Ich würde mich gerne über den Proxyserver mit einer Applikation auf einem anderen Server verbinden.
Bisher direkt über Socketverbindung.
Man bedenke der Port am Zielserver ist ein anderer wie der des Proxies.

Proxy war bisher nicht implementiert und über Kommandozeile hats nicht Funktioniert.
Das hier war ein Beispiel,das ich probiert hatte. 
start C:\"Program Files (x86)"\Java\jre7\bin\javaw.exe -DproxySet=true -DproxyHost=xxx.xxx.xxx.xxx -DproxyPort=8080 -DsocksProxyHost=xxx.xxx.xxx.xxx -DsocksProxyPort=1080 -cp  ;javadbf-0.4.0.jar;comm.jar; -Xms512m -Xmx512m path/MainDummy

Oder muss ich noch was beachten. Kommandozeile würds auch tun, wenn die Verbindung über https oder http auf dem Proy gehen kann.


----------



## elmelm (10. Juni 2013)

Hallo zusammen. Habe das inzwischen etwas so wie der Kollege von damals. Nur mit meinen Werten. Und habe den Namensdreher bei Host und Port rausgemacht, den er drin hatte.

// der zu kontaktierende Host
String host = "xxx.xxx.xxx.xxx";
int port = 80;

// unser Proxy
String proxyHost = "xxx.xxx.xxx.xxx";
int proxyPort = 8080;

// put properties
System.setProperty("socksProxyHost", proxyHost);
System.setProperty("socksProxyPort", String.valueOf(proxyPort));

// set up proxy
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort));

// set up socket
socket = new Socket(proxy);

// contact host
socket.connect(new InetSocketAddress(host, port));

Bekomme jedoch das selbe Resultat. 
Die Zeil
// contact host
socket.connect(new InetSocketAddress(host, port));
lässt mich in den catch Zweig meiner trxy{}catch{} kommen.

Weis da wer Rat?

Danke schon mal!


----------



## elmelm (10. Juni 2013)

Würde es denn funktionieren das ganze auch auf URL-Verbindung auf zu bauen? Dann also mit https oder http.

Oder muss man für Client-Server Programme nen Socket nehmen?

Es können sich mehrere Clients gleichzeitig verbinden. Wie gesagt ich bin noch nicht so tief in der Materie drin... .
Daher frage ich hier .

Sicher ist aber, dann werde ich nicht nur Client sondern auch Server umbauen müssen.

Kennt sich hier wer aus, was da warum Sinnvoller ist?
Die Software soll nachher über diese Ports laufen, da die sich oft durch administrativ geschütze Systeme verbindet, bei denen die EDV und schwere Probleme bereitet.

Danke schon mal!


----------

