ich möchte von einer Applikation aus auf's Internet zugreifen. Jetzt
sitzen wir hier in der Firma hinter einem Proxy. Ich stelle also
zunächst die Proxy-Daten in den Properties ein:
System.getProperties().setProperty("http.proxySet", "true");
System.getProperties().setProperty("http.proxyHost", ip-adresse);
System.getProperties().setProperty("http.proxyPort", meinPort);
Danach versuche ich, über (etwas vereinfacht)
new URL(meineAdresse).openConnection()
eine Verbindung aufzubauen. Ohne Proxy klappt alles einwandfrei.
Wenn ich über den Proxy gehe, bekomme ich aber immer eine
"java.net.NoRouteToHostException: No route to host: connect"-
Exception.
Es scheint so, als wenn er die Proxyeinstellungen komplett ignoriert.
Habe das auch schonmal mit unserem Admin angeguckt, aber da er kein
Java kennt, weiß er natürlich auch keine weiteren Einstellungen, die
man vornehmen könnte. Über die Internet-Browser (also IE oder
Firefox)
funktioniert das mit Proxyeinstellungen einwandfrei, ebenso in
anderen
Windows-Anwendungen.
Ich arbeite mit jre_1_6_03 unter Windows.
Weiß hier vielleicht jemand Rat, wo ich noch dran schrauben könnte?
Danke!
Sören
PS: Hier mal der ganze Stack-Trace:
java.net.NoRouteToHostException: No route to host: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:
333)
at
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:
195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:
394)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:
529)
at
sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:
271)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:
328)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClien...
172)
at
sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:
729)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Abstrac...
158)
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection....
977)
at
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConn...
234)
at java.net.URL.openStream(URL.java:1009)
Scheint unnötig zu sein, bzw. nicht zu funktionieren.
>
> Danach versuche ich, über (etwas vereinfacht)
>
> new URL(meineAdresse).openConnection()
>
[...]
Habe es anscheinend durch ausprobieren irgendwie geschafft:
InetAddress iad = InetAddress.getByName(meineProxyIpAdresse);
Socket s = new Socket(iad, meinProxyPort);
proxy = new Proxy(Proxy.Type.HTTP, s.getRemoteSocketAddress());
myUrl.openConnection(proxy);
Verstehe aber nach wie vor nicht so ganz, wozu dann die Einstellungen
in den Properties da sind.
Weiß auch nicht, ob das jetzt die Musterlösung ist, vielleicht geht's
eleganter, aber hauptsache, es funktioniert erstmal.
Falls noch einer was dazu weiß, wäre es wissenswert für mich (und
vielleicht andere auch).
Tschö
Sören
>System.getProperties().setProperty("http.proxySet", "true");
>System.getProperties().setProperty("http.proxyHost", ip-adresse);
>System.getProperties().setProperty("http.proxyPort", meinPort);
Nicht alle Properties lassen sich (selbst ganz am Anfang von main())
programmatisch über java.lang.System setzen, da sie bereits fürs
Hochfahren der VM benutzt werden und nur einmal ausgelesen werden, was in
dem Fall dann schon passiert ist, wenn die Kontrolle an main() übergeben
wird.
Solche Properties lassen sich der VM nur beim Starten über die
Kommandozeilenoption -D<property-name>=<value> mitteilen.
Ich bin mir gerade nicht sicher ob die HTTP-Proxy Properties zu dieser
Kategorie gehören und habe auch gerade nicht nachgeschaut ob deine
Properties die richtigen sind, aber du solltest es mal über die -D-Option
probieren.
cu
>System.getProperties().setProperty("http.proxySet", "true");
>System.getProperties().setProperty("http.proxyHost", ip-adresse);
>System.getProperties().setProperty("http.proxyPort", meinPort);
Ach noch was fällt mir gerade auf: Warum verwendest du nicht direkt
System.setProperty() ? Denn System.getProperties() liefert dir womöglich
nur eine Kopie der wirklichen Properties und dann ist es völlig belanglos,
was du an dieser Kopie änderst.
cu
Hatte ich auch schon ausprobiert, war aber der gleiche Effekt.
Ich probier morgen nochmal deinen anderen Tipp.
Allerdings heißt das auch, dass man zur Laufzeit des Programms den Weg über
den Proxy nicht ein- oder ausschalten kann.
Danke auf jeden Fall!
Sören
Falls es sich um JDK 1.5 oder höher handelt, hast Du die Möglichkeit
einen eigenen ProxySelector (java.net.ProxySelector) zu implementieren,
der bei jedem Verbindungsaufbau befragt wird. Dann hast Du es selber in
der Hand, wann welcher Proxy benutzt wird.
Gruß,
Andreas
Jo, habe unter dem Stichwort diesen Link gefunden:
http://java.sun.com/j2se/1.5.0/docs/guide/net/proxies.html
(warum vorher eigentlich nicht, nänänä?).
Da habe ich mit meiner Version ja richtig geraten :-)
Der ProxySelector ist für meine Bedürfnisse etwas übertrieben.
Danke für den Hinweis!
Sören
> new URL(meineAdresse).openConnection()
> eine Verbindung aufzubauen. Ohne Proxy klappt alles einwandfrei.
> Wenn ich über den Proxy gehe, bekomme ich aber immer eine
> "java.net.NoRouteToHostException: No route to host: connect"-
> Exception.
warum openConnection? Das muss über einen Proxy nicht funktionieren, da
dieser eben meist auf Objekt-Ebene arbeitet. "Direktverbindungen" werden
nur über die HTTP-Methode "CONNECT" zugelassen, da das für HTTPS nötig
ist. Vielleicht solltest du mit deinem Admin mal schaun, ob der Proxy
auch HTTPS macht, und das auch für Zielports != 443. In Firmennetzen ist
letzteres meist nicht der Fall, da man damit das Netz von innen nach
außen ziemlich weit aufmacht.
Falls du wirklich "nur" HTTP-Objekte abfragen willst, warum nicht mit
der Methode
public final InputStream openStream()
?
HTH
Matthias
>warum openConnection?
Weil's richtig ist?!
Du verwechselst da was. openConnection() erzeugt nur ein passendes
URLConnection-Objekt, aber das heißt noch lange nicht, dass da jetzt
sofort eine Netzwerk- oder gar HTTP-Verbindung geöffnet wird.
cu
>warum openConnection?
vs.
>warum nicht mit der Methode
>
>public final InputStream openStream()
Du weißt, dass openStream() so implementiert ist
return openConnection().getInputStream();
??
(Steht übrigens in den JavaDocs.)
cu
> Du weißt, dass openStream() so implementiert ist
>
> return openConnection().getInputStream();
Ne, dann hätt ich ja nicht so doof gefragt ;)
Die Doc die ich aufgesucht hab, und die rein äußerlich auch wie JavaDoc
aussieht, hat folgendes ausgesagt:
public URLConnection openConnection()
Liefert ein URLConnection-Objekt für die URL, mit dem bidirektionaler
Datenaustausch mit der URL möglich ist.
[...]
public final InputStream openStream()
Eröffnet einen InputStream für das URL-Objekt, mit dem die URL-Daten
gelesen werden können.
[...]
Da hab ich "bidirektional" und "gelesen" schon so verstanden, dass die
erste Methode versucht, explizit eine Verbindung herzustellen, während
letztere eben "irgendwie" per GET das Objekt anfordert und zur Verfügung
stellt. Aber stimmt, ich hab schonmal irgendwas mit openStream
implementiert, wo auch die Headerdaten mit ausgegeben werden.
Naja, das scheint eine etwas betagte deutsche Übersetzung zu sein. Also
Notiz an mich: ab jetz immer direkt auf sun.com schaun ;)
gruß