# Live-Bild wird im Browser nicht aktualisiert



## UdjENE (22. Mai 2007)

Hey leute,

habe da ein kleines Applet-Programm geschrieben, dass mir alle 500 ms ein neus bild lädt und anzeigt. Klappt auch wunderbar im Applet-Viewer. Jedoch wenn ich das Applet in eine HTML-Seite einbinde und im Browser starte (FF und IE) wird das Bild nur am anfang geladen und nicht mehr aktualisiert. dieses Problem tritt jedoch nur mit der jre 1.6 auf. mit 1.5 hat das Aktualisieren im Browser geklappt. 



```
import java.awt.*;
import java.applet.*;
import java.net.URL;
import java.text.DateFormat;
import java.util.Date;


public class LiveCam extends Applet implements Runnable
{

	private static final long serialVersionUID = 1L;
	Image img;
	Thread liveThread;
	int timeInterval=500;
	String time="";
	

	public void destroy()
	{
		liveThread.stop();
	}

	
	public void run()
	{
		
		while (true)
		{
			
			try
			{
				// lege den Thread schlafen
				Thread.sleep(timeInterval);

				// das Image in den Buffer ablegen
				img.flush();
				img = getImage(new URL("http://localhost/live.jpg"));
				
				// warte bis Image geladen ist
				MediaTracker mediaTracker_track = new MediaTracker(this);
				mediaTracker_track.addImage(img, 1);
				mediaTracker_track.waitForID(1);
				// zeichne neues Image
				repaint();
			}
			catch (Exception e)
			{
				System.out.println("Caught:"+e.toString());
			}
		}
	}

	public void init()
	{
		try
		{
			//img = getImage(getCodeBase(),"live.jpg");
			img = getImage(new URL("http://localhost/live.jpg"));
			MediaTracker mediaTracker_track = new MediaTracker(this);
			mediaTracker_track.addImage(img, 1);
			mediaTracker_track.waitForID(1);
		}

		catch(Exception e)
		{
			showStatus("Problem getting initial image: "+e.toString());
			return;
		}

		liveThread = new Thread(this);
		liveThread.start();

	}

	public void paint(Graphics g)
	{
		try 
		{ 
		  DateFormat dateInstance = DateFormat.getDateTimeInstance(); 
		  time = dateInstance.format( new Date() ); 
		  
		} 
		catch ( Exception e ) 
		{ 
		  e.printStackTrace(); 
		}
			
			g.drawImage(img, 0,0, this);
			g.drawString("Time:", 0,300);
			g.drawString(time, 40,300);
	}
	
}
```

die einziegste Lösung, die mir bis jetzt eingefallen ist, biem anfordern des bildes eine zufallszahl hintendranzuhängen. dadurch wird das Bild im Browser zwar aktualisiert, aber max. alle 2 sec. (obwohl Interval auf 500 ms gesetzt ist) und mit einer hohen CPU-Auslastung.

Hat jeman eine Idee was da los ist???


----------



## Wildcard (22. Mai 2007)

Bekommst du eine Ausgabe in der Java Konsole?


----------



## UdjENE (22. Mai 2007)

ne keine ausgabe. übrigens das neue bild wird erst angezeigt wenn ich den Broswer zu mache und dann wieder starte. also ein Browser-Refresh nützt da garnix


----------



## Wildcard (22. Mai 2007)

Durchaus möglich das der Browser das im Cache hat. Nimm stattdessen ImageIO.


----------



## UdjENE (22. Mai 2007)

hab´s grad probiert mit *img = ImageIO.read( new File( "live.jpg" ) );*. leider hat sich nix geändert


----------



## Wildcard (22. Mai 2007)

Das kann auch nicht gehen sofern dein Applet nicht signiert ist.


----------



## UdjENE (22. Mai 2007)

hey hat geklappt. es lag an der fehlenden signierung. Vielen Dank für die schnelle Hilfe :toll:


----------



## Wildcard (22. Mai 2007)

Nein, das ist keine Lösung, so geht es nur lokal.
Du musst dich über http zu dem Server verbinden von dem das Applet geladen wurde und dir dort das Bild holen.
Dafür muss das Applet nicht signiert sein.


----------



## UdjENE (22. Mai 2007)

hast recht, geht nur lokal. vom lokalen Webserver kommt gar kein bild.
kannst du dafür vlt ein beispiel posten?


----------



## Wildcard (22. Mai 2007)

URLConnection öffnen, inputstream holen, an ImageIO übergeben


----------



## UdjENE (22. Mai 2007)

hast du es so gemeint? hat leider nix geändert. bild wird nicht aktualisiert...

```
public void run()
	{
		
		while (true)
		{
			
			try
			{
				// lege den Thread schlafen
				Thread.sleep(timeInterval);

				// das Image in den Buffer ablegen
				img.flush();
				
				URL url = new URL ("http://localhost/live.jpg");
			        InputStream in = new BufferedInputStream (url.openStream ());
			    
			        img = ImageIO.read(in);
				
				// warte bis Image geladen ist
				MediaTracker mediaTracker_track = new MediaTracker(this);
				mediaTracker_track.addImage(img, 1);
				mediaTracker_track.waitForID(1);
				// zeichne neues Image
				repaint();
			}
			catch (Exception e)
			{
				System.out.println("Caught:"+e.toString());
			}
		}
	}
```

von einem externen Server, geht es ebenfalls nicht.


----------



## Wildcard (22. Mai 2007)

1. Den MediaTracker brauchst du nicht.
2. Den Stream musst du schließen, ImageIO macht das nicht.
3. mach vorher mal folgendes: ImageIO.setUseCache(false);
4. was spricht die Java Konsole.
5. ein System.out.println(img); in die run.


----------



## UdjENE (23. Mai 2007)

hi also meine run() sieht nun so aus:


```
Thread.sleep(timeInterval);
				
ImageIO.setUseCache(false); 
				
URL url = new URL ("http://localhost/live.jpg");
InputStream input = new BufferedInputStream (url.openStream ());
			    
img = ImageIO.read(input);
System.out.println(img);
				
repaint();
input.close();
```

das Image wird jedoch nicht aktualisiert. und wenn ich das Image vom localhost lösche, dann kommt nicht mal eine Warnmeldung in der Konsole. die einzigste Meldung die alle 500ms kommt ist die:

*BufferedImage@e576d4: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@105d88a transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 320 height = 240 #numDataElements 3 dataOff[0] = 2*


----------



## Wildcard (23. Mai 2007)

Der Hash ist immer BufferedImage@e576d4?
Wenn ja, dann macht dir vielleicht der ImageIO Cache einen Strich durch die Rechnung.
Weiter zur nächsten Methode:
http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#createImage(java.net.URL)


----------



## UdjENE (23. Mai 2007)

nein, der Hash BufferedImage@xxxxxx ist alle 500ms anders. also das Applet fordert schon immer ein neues Image an, nur der Browser will das Bild nicht akt.


----------



## Wildcard (23. Mai 2007)

UdjENE hat gesagt.:
			
		

> nein, der Hash BufferedImage@xxxxxx ist alle 500ms anders. also das Applet fordert schon immer ein neues Image an, nur der Browser will das Bild nicht akt.


Der Browser hat da überhaupt nichts zu melden. Er initialisiert das Applet, von da ab muss es alleine klarkommen.


----------



## UdjENE (23. Mai 2007)

also mit *img = getToolkit().createImage(new URL ("http://localhost/live.jpg"));* geht´s leider aucg nicht. wie gesagt im AppletViewer funktionierts einwandfrei, das Applet fordert alle 500ms ein neues Bild vom localhost an. aber wenn das Applet im Browser arbeitet, wird nix vom localhost angefordert  :bahnhof:


----------



## Wildcard (23. Mai 2007)

Du hast hoffentlich auch vor jedem versuch den Java Cache gelöscht (am besten du schaltest ihn ganz aus)? 
Das ist nämlich ein böse Falle für Applet Entwickler  :wink:


----------



## UdjENE (23. Mai 2007)

naja dazu muss ich sagen, dass das Cache löschen nix geändert hat. denn wenn ich eine neue Appletversion geladen habe, hat er mir die alte angezeigt, obwohl ich Cache geleert habe.
deshalb habe ich vor dem laden einer neuen Version den FF neugestartet.
So komisch ist halt noch, dass das ganze mit der jre 1.5 geklappt hat. aber mit jre 1.6 geht das nicht.


----------



## Wildcard (23. Mai 2007)

Nein, nicht den Browser Cache, sondern den Java Cache.
Das geht über das Java Control Panel.


----------



## UdjENE (23. Mai 2007)

hab den Java Cache gelöscht. lag nicht daran


----------



## UdjENE (24. Mai 2007)

hi, also ich hab´s jetzt hinbekommen, dass das bild im browser aktualisiert wird und zwar hänge ich an die URL eine Zufallszahl : 
	
	
	
	





```
URL url = new URL ("http://localhost/live.jpg?"+Math.random());
```

also das bild wird jetzt alle 500ms aktualisiert und nicht wie am anfang alle 2s. denke das liegt daran, dass ich imageIO verwende und den Java Cache ausgeschaltet habe. thx wildcard!


----------

