# URL mit Button öffnen



## 1342 (31. Aug 2010)

Hallo zusammen,

ich wollte mit einem Button aus meinem Applet eine URL aufrufen.

Das habe ich soweit auch geschafft. mit:


```
try {
		        	Desktop.getDesktop().browse( new URL("http://" +Daten[0]+"/decoder_control.cgi?command=4&onestep=1000") );
		        }
		        catch ( Exception e1 ) { }}
```

diese URL wird euch nichts sagen, da ich mit dieser meine WLAN Kamera steuere.
Dies ist der Befehl um nach rechts zu fahren.

Mein Problem ist nun, dass ich den Browser gar nicht öffnen will. Ich muss aber den Input an die Webcam über den Browser schicken.

Gibt es dafür Lösungen? Kann man den Browser im Hintergrund laufen lassen, oder es so programmieren, dass die Information zwar geschickt wird, der Browser sich aber nicht öffnet, oder nicht sichtbar ist?

Denn sobald ich auf den Button drücke, erscheint natürlich das neue Browserfenster und ich sehe nichts mehr von meinem Applet.

Dankeschön!


----------



## eRaaaa (31. Aug 2010)

Naja, würde es nicht reichen, auf dem URL-Objekt getContent() bzw. openStream() o.ä. aufzurufen?


----------



## SlaterB (31. Aug 2010)

verwende
URLConnection (Java Platform SE 6)
oder HTTPClient oder sonst eine interne Java-API wenn du nicht ein externes Programm aufrufen möchtest


----------



## 1342 (31. Aug 2010)

hm, weiss nicht ob das reichen würde.....

ich weiss ehrlich gesagt auch nicht wo und wie ich das einfügen soll.

hast du da noch nen tipp?

Danke


----------



## AmunRa (31. Aug 2010)

```
Url url= new URL("http://" +Daten[0]+"/decoder_control.cgi?command=4&onestep=1000");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.connect();
```


das einfach ausführen wenn du auf den Button klickst.

Das macht jetzt eigentlich nichts anderes wie dein Brwoser wenn du es in die Addresszeile eintippst.


----------



## 1342 (31. Aug 2010)

Also ich hab das mal in mein Programm eingefügt aber die Funktion geht noch immer nicht. Es sind alle Fehlermeldungen weg aber wenn ich auf den Button Rechts klicke dreht sich die Kamera nicht.

Hier mal den Ausschnitt von dem Button, vielleicht ist ja noch was falsch.

```
// Wird ausgef¸hrt wenn die Maus auf den Buttons "Rechts" bzw. "Links" bet‰tigt wird
	    public void mousePressed(MouseEvent e)
	    {
	    	button = (AbstractButton)e.getSource(); // Gibt das auslˆsende Objekt zur¸ck
        	label = button.getText(); // Name des Objekts in Variable speichern
	    	
	    	if(label.equals("Rechts")) // Wird ausgef¸hrt wenn "Rechts" bet‰tigt wurde
			{}
	    		try // Versuche
	    		{
	    		URL url= new URL("http://"+Daten[0]+"/decoder_control.cgi?command=4&onestep=100");
	    		con = (HttpURLConnection) url.openConnection();
	    		con.setRequestMethod("GET");
	    		con.connect();
	    		}
	    			
	    		catch(IOException e1) 
	    		{
	    			
	    		}
```


----------



## Bartleby (31. Aug 2010)

Vielleicht fliegt ja eine Exception. Da du diese aber nicht ausgibst, siehtst du auch keinen Fehler.
Versuche mal:


```
catch(IOException e1) 
{
  e1.printStackTrace();                    
}
```


----------



## XHelp (31. Aug 2010)

Bekommst du denn irgendwas zurück? Fliegt irgendeine Exception (leerer catch block ist nicht sinnvoll)? Musst du dich vllt vorher anmelden?


----------



## AmunRa (31. Aug 2010)

kannst du in den CATCH block eine ausgabe machen sodass man erfährt ob ein Fehler passiert.
weiter könntest du unter dem con.connect noch dies einfügen


```
System.out.println( con.getResponseMessage());
BufferedReader rd= new BufferedReader( new InpuStreamReader(con.getInputStream());

String line;
while((line=rd.readLine())!= null){
System.out.println(rd);
}
```


----------



## 1342 (31. Aug 2010)

Bartleby hat gesagt.:


> Vielleicht fliegt ja eine Exception. Da du diese aber nicht ausgibst, siehtst du auch keinen Fehler.
> Versuche mal:
> 
> 
> ...



ich hab das mal eingefügt und getestet also es kommt keine Meldung zurück...


----------



## 1342 (31. Aug 2010)

AmunRa hat gesagt.:


> kannst du in den CATCH block eine ausgabe machen sodass man erfährt ob ein Fehler passiert.
> weiter könntest du unter dem con.connect noch dies einfügen
> 
> 
> ...



Ich hab das jetzt noch eingefügt und dann sind diese Fehlermeldungen gekommen:

```
Unauthorized
java.io.IOException: Server returned HTTP response code: 401 for URL: [url]http://192.168.2.23/decoder_control.cgi?command=6&onestep=100[/url]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1368)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.net.[url]www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1362[/url])
	at sun.net.[url]www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1016[/url])
	at webcam.GUI$mAdapter.mousePressed(GUI.java:199)
	at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
	at java.awt.Component.processMouseEvent(Component.java:6345)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6113)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4714)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4544)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
	at java.awt.Container.dispatchEventImpl(Container.java:2129)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4544)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: [url]http://192.168.2.23/decoder_control.cgi?command=6&onestep=100[/url]
	at sun.net.[url]www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1313[/url])
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373)
	at java.net.HttpURLConnection.getResponseMessage(HttpURLConnection.java:439)
	at webcam.GUI$mAdapter.mousePressed(GUI.java:198)
	... 21 more
```

Ganz oben steht "Unauthorized" könnt das daran liegen das wir an unserer Kamera ein Benutzer und Passwort haben?


----------



## homer65 (31. Aug 2010)

Mal was der Http responsecode 401 bedeutet:

10.4.2 401 Unauthorized

The request requires user authentication. The response MUST include a WWW-Authenticate header field (section 14.47) containing a challenge applicable to the requested resource. The client MAY repeat the request with a suitable Authorization header field (section 14.8). If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials. If the 401 response contains the same challenge as the prior response, and the user agent has already attempted authentication at least once, then the user SHOULD be presented the entity that was given in the response, since that entity might include relevant diagnostic information. HTTP access authentication is explained in "HTTP Authentication: Basic and Digest Access Authentication" [43]. 

Deine Vermutung scheint also richtig zu sein.


----------



## AmunRa (31. Aug 2010)

Ja du musst wahrscheinlich dein Username und passwort mitsenden.

wie rufst du denn normaler weise diese URL auf?


----------



## SlaterB (31. Aug 2010)

der Browser ist wahrscheinlich eingeloggt und sendet ein Cookie,
na ob man das alles ohne richtige Kenntnisse korrekt übertragen kann?
ich persönlich habe das auch noch nicht gemacht, hier mal ein Link

Google
->
HOW-TO: Handling Cookies Using the java.net API


----------



## 1342 (31. Aug 2010)

Das ist eine WLan Kamera und normal rufen wir den Befehl einer im Browser auf, wir suchen ja jetzt die Lösung damit wir das über unser Java Programm machen können.
Wie send ich das passwort und alles mit.


----------



## SlaterB (31. Aug 2010)

wie machst du es denn mit dem Browser, gibt es eine Login-Seite?
siehe auch mein Posting zuvor


----------



## 1342 (31. Aug 2010)

Ja beim Browser gibt es eine Login Seite, den Livestream hab ich schon in mein Java Programm eingebunden mit dem Passwort und Benutzername. Jetzt will ich nur noch die Buttons (Rechts,Links) damit ich sie Steuern kann.


----------



## XHelp (31. Aug 2010)

Du könntest es auch mit 
	
	
	
	





```
http://user:pass@192.168.2.23/decoder_control.cgi?command=6&onestep=100
```
versuchen.
Bei den Login-Seiten etc. wird ja meistens kein Fehler geschmissen, sondern nur eine Seite mit "bla... nicht angemeldet... bla" zurückgegeben.


----------



## AmunRa (31. Aug 2010)

Die Frage war eher darauf bedacht gibst du da normaler weise bei deinem Browser ein Passwort an (bzw hast du da mal ein Passwort eingegeben und damals den Haken angemeldet beleiben oder so angehakt) wenn ja kann man rausfinden wie man das ganze machen sollte.

Kennst du Wireshark? 
Mit dem könntest du mal versuchen das HttpPackage das gesendet wird wenn du das ganze über einen Browser mit zu sniffen. (dort solltest du dann eben auch sehen ob/welches Cookie gesendet wird. bzw, ob das PW )

(Hab gerade etwas ähnliches Programmiert)


----------



## bygones (31. Aug 2010)

wie gesagt... du musst diese authentifizierungsinformation auch in dem HTTP Request mitschicken.

nur allein in deinem java programm schon ein login zu haben bringt nicht viel.

Let me google that for you


----------



## 1342 (31. Aug 2010)

XHelp hat gesagt.:


> Du könntest es auch mit
> 
> 
> 
> ...



Okay das versuch ich mal , ich hab noch einen anderen Befehl, ich test die zwei gerade mal und meld mich gleich nochmal.


----------



## 1342 (31. Aug 2010)

Also ich hab mal beide möglichkeiten getestet. Bei dieser:
http://user:pass@192.168.2.23/decoder_control.cgi?command=6&onestep=100

kommt noch immer Unauthorized fehler.

bei der anderen möglichkeit kommt:

Not Found


----------



## SlaterB (31. Aug 2010)

> den Livestream hab ich schon in mein Java Programm eingebunden mit dem Passwort und Benutzername. 

na also, in deinem anderen Thread 
http://www.java-forum.org/spiele-multimedia-programmierung/104978-livestream-java-einbinden.html
hast du den Code zwar nicht selber geschrieben,
aber da gibts doch auch 


```
huc = (HttpURLConnection) u.openConnection();
```
und dann 

```
private String encodeUsernameAndPasswordInBase64(String usern, String psswd)

[..]
// Benutzer und Passwort benutzen
huc.setRequestProperty("Authorization",base64authorization);
huc.connect(); // Die Verbindung wird geˆffnet
```
das musst du doch wahrscheinlich alles nur hier auf diese Verbindung übertragen, so schwer zu erkennen?
oder verwendest du das dort gar nicht?


----------



## AmunRa (31. Aug 2010)

1342 hat gesagt.:


> bei der anderen möglichkeit kommt:
> Not Found




Nicht dass es wichtig wäre, wenn das was SlaterB geschreiben hat schon die Lösung ist (da hättest du wirklich selbst drauf kommen können), 

aber wenn du uns schon mitteilst, dass die andere Möglickeit  diesen Fehler verursacht wäre es nett zu wissen, was die andere Möglichkeit ist.


----------



## 1342 (31. Aug 2010)

Ich versuch das gerade mal was SlaterB gesagt hat.

Die andere Möglichkeit war einfach eine andere Form für das passwort:



> URL url= new URL("http://192.168.2.23/decoder_control.cgi[?user=&pwd=command=6&onestep=100]");


----------



## 1342 (31. Aug 2010)

ich schreib jetzt nochmal das ursprüngliche Problem, bevor wir uns zu weit in die Tiefen der Programmierung stürzen 

1.ich kann die kamera schon über die url steuern. mit dem befehl aus dem allerersten beitrag.

2.das problem ist, dass sich dann logischerweise der browser öffnet und das applet überdeckt. und das jedesmal wenn ich die kamera mit einem button bewegen will aufs neue.

3. das soll nicht mehr passieren. 

ich hoffe ich geh euch nicht zu sehr auf die nerven ;-)


----------



## AmunRa (31. Aug 2010)

das ist schon alles klar. Dein Brwoser macht nur einiges im Hintergrund das du als User nicht siehst. 
z.B Cookies verwalten und mitsenden, Session speichern

wenn du nun eben eine Lösung willst die ohne Brwoser funktionert musst du nun also diese sachen selbst machen.

Ich frage dich also nun direkt nocheinmal, wenn du über den Browser deine Kamera steuerst, musst du dafür irgendwo ein Passwort angeben?


----------



## JohannisderKaeufer (31. Aug 2010)

Und ob es dir paßt oder nicht, der Befehl in deinem ersten Post lautet:

Öffne den Standardbrowser und rufe dort die übergebene URL auf.


----------



## JohannisderKaeufer (31. Aug 2010)

```
http://user:pass@192.168.2.23/decoder_control.cgi?command=6&onestep=100
```

Mach daraus mal ein 


```
http://192.168.2.23/decoder_control.cgi?command=6&onestep=100&user=DEINUSERNAME&pwd=DEINPASSWORT
```

Ansonsten:

um welche Kamera, Software handelt es sich denn?


----------



## 1342 (31. Aug 2010)

JohannisderKaeufer hat gesagt.:


> ```
> http://user:pass@192.168.2.23/decoder_control.cgi?command=6&onestep=100
> ```
> 
> ...



Vielen dank! es geht!!

Mit diesem Code:


```
http://192.168.2.23/decoder_control.cgi?command=6&onestep=100&user=DEINUSERNAME&pwd=DEINPASSWORT
```


----------

