# Verzögerung beim Refresh (F5) mit einem Applet verursachen



## el_vital (22. Jan 2009)

Hallo,

ich habe für eine spezielle "Hardware" ein Web-Interface programmiert. Wenn über IP auf die Hardware zugegriffen wird, wird eine HTML Seite mit einem Aufruf eines Applets an den Browser gesendet. Danach fragt Browser das Applet an und bekommt es auch von der Hardware. Das läuft auch. Es ist aber so, dass gleichzeitig nur eine Verbindung zu der Hardware möglich ist. Wenn also ein Web-Interface geöffnet ist, kann kein weiteres geöffnet werden. Wird die Seite geschlossen oder mit F5 aktualisiert, schlisse ich im Destroy von dem Applet die Verbindung und der Socket ist dann für eine neue Verbindung geöffnet.

Das Problem ist, dass der Browser beim betätigen von F5 zu schnell versucht eine neue Verbindung zu öffnen. Da ist aber der Socket noch nicht freigegeben. Es handelt sich wahrscheinlich um Millisekunden wo der Browser zu schnell ist. Wenn ich beim Aktualisieren es zuerst beim Applet mitbekommen würde, dann könnte ich die Verbindung schlissen und bräuchte eine Sekunde Pause bis der Browser die Seite erneut anfragt. Ist es irgendwie möglich das zu bewerkstelligen?


----------



## Empire Phoenix (26. Jan 2009)

Auch wenn es unperformant ist, wie wäre es wenn du in deinem Applet die Verbindung nur wenn du Daten brauchst aufgebaut hast, und danach sofort wieder schließt? (non-persistent)


----------



## Guest (26. Jan 2009)

Empire Phoenix hat gesagt.:
			
		

> Auch wenn es unperformant ist, wie wäre es wenn du in deinem Applet die Verbindung nur wenn du Daten brauchst aufgebaut hast, und danach sofort wieder schließt? (non-persistent)


den Weg habe ich auch probiert und es funktioniert, aber das macht zu viel Datenverkehr, da es mehrmals in der Sekunde aktualisiert werden muss und mehrere Geräte gleichzeitig im Netzwerk arbeiten.


----------



## el_vital (26. Jan 2009)

Entschuldigung, ich hatte mich vergessen einzuloggen. Der letzte Beitrag ist von mir. Mit der Aktualisierung mehrmals in der Sekunde habe ich gemeint, dass so oft Messdaten von der Hardware an das Applet übertragen werden müssen. Und bei einer nicht Dauerverbindung gibt es zu viel Datenverkehr durch verbinden, anfragen, empfangen, Verbindung trennen. Eine Dauerverbindung muss hier schon sein.


----------



## byte (26. Jan 2009)

Fang doch die entsprechende Exception beim Start ab und mach dann ein paar Retries, jeweils mit einer gewissen Wartezeit dazwischen.


----------



## el_vital (26. Jan 2009)

byto hat gesagt.:
			
		

> Fang doch die entsprechende Exception beim Start ab und mach dann ein paar Retries, jeweils mit einer gewissen Wartezeit dazwischen.


so weit kommt es ja nicht. Die HTML Seite wird nach einem Browser-Refresh nicht geladen.
Bei normalen Start des Webinterfaces über die IP-Adresse und den entsprechendem Port wird eine HTML-Seite mit dem Aufruf eines Applets übertragen, darauf hin fragt der Browser das Applet an und meine Anwendung auf der Hardware sendet das Applet dem Browser. Danach wird das Applet gestartet, baut eine permanente Verbindung zu der Hardware auf und empfängt kontinuierlich die Daten und zeigt diese an. Wenn jetzt im Browser "F5" betätigt wird, wird das Applet beendet und im Destroy schlisse ich die Verbindung zu der Hardware. Danach ist die Hardware unmittelbar bereit neue Verbindung zu öffnen. Aber leider nicht schnell genug. Der Browser fragt nach "F5" sofort die HTML Seite an und bekommt nichts da die Hardware den Socket noch nicht freigegeben hat. Betätigt man "F5" nochmal funktioniert es wieder, die Verbindung wird geöffnet, HTML übertragen und Applet aus dem Cache des Browsers gestartet.


----------



## Ebenius (26. Jan 2009)

Wird beim Reload Applet.stop() gerufen? Oder Applet.destroy() Kannst Du dann nicht die Verbindung schließen und ein bisschen warten? Funktioniert das? Hab's nie probiert.


----------



## el_vital (26. Jan 2009)

Ebenius hat gesagt.:
			
		

> Wird beim Reload Applet.stop() gerufen? Oder Applet.destroy() Kannst Du dann nicht die Verbindung schließen und ein bisschen warten? Funktioniert das? Hab's nie probiert.


ich habe versucht in destroy() nach dem schlissen der Verbindung zu warten. Funktioniert leider nicht. Der Browser wartet nicht, sondern killt das Applet.


----------



## L-ectron-X (26. Jan 2009)

Ebenius hat gesagt.:
			
		

> Wird beim Reload Applet.stop() gerufen? Oder Applet.destroy()


Du wirst es nicht glauben, aber das machen die Browser unterschiedlich. Opera ruft auch destroy() auf, während der IE nur stop() aufruft. Zumindest war das mal so.


----------



## Ebenius (26. Jan 2009)

Bei Web-Browsern glaub ich alles!


----------



## Empire Phoenix (26. Jan 2009)

Simple frage, was passiert eigentlich wenn die Verbindung garnicht geschlossen wird? Timed die dann Hardewarebedingt aus oder wie funktuioniert das?

Weil dann wäre die Frage ob sich das Problem nicht viel eleganter lösen lässt, indem das Applet wenn eine Verbindung nicht zustandekommt es nochmals 1 Sekunde später versucht?


----------



## Ebenius (26. Jan 2009)

Empire Phoenix hat gesagt.:
			
		

> Weil dann wäre die Frage ob sich das Problem nicht viel eleganter lösen lässt, indem das Applet wenn eine Verbindung nicht zustandekommt es nochmals 1 Sekunde später versucht?


Ich glaube, das Problem ist, dass der Browser bei Reload das Applet nicht laden kann, weil der Port noch belegt ist. Das hat das Applet nicht in der Hand.


----------



## Empire Phoenix (27. Jan 2009)

```
boolean offline = true;
while (offline){
Thread.sleep(200); //If we repeatly try it this makes sure we at least not use 100% cpu.
try{
socket = new Socket(whatever)
offline = false;
}
catch (AlreadyBoundexeption e) //duno the name
{}
}

//at this point we should be online!
```

Wie wärs mit sowas?


----------



## el_vital (27. Jan 2009)

Empire Phoenix hat gesagt.:
			
		

> ```
> boolean offline = true;
> while (offline){
> Thread.sleep(200); //If we repeatly try it this makes sure we at least not use 100% cpu.
> ...



es kommt nicht zum Applet wenn die Hardware nicht erreichbar ist weil die HTML-Seite nicht übertragen wird. Wenn Applet aufgerufen wird, dann besteht schon die Verbindung mit dem Server.


----------



## L-ectron-X (27. Jan 2009)

Ich habs vielleicht noch nicht zu Ende gedacht. Aber es könnte mit einem Frameset gehen.

Du brauchst dazu ein Frameset mit wenigstens 2 Frames, ein Steuer-Applet, welches unsichtbar in einem Teil des Framesets sitzt und dein eigentliches Applet, welches im anderen Frame liegt und sich mit deiner Hardware verbindet. Du kannst das Steuer-Applet auch sichtbar machen, dann könnte es z.B auch einen Status anzeigen.

Wenn dein "Hardware"-Applet geschlossen wird, kann es in seiner stop()- oder destroy()-Methode das Steuer-Applet über diesen  Vorgang informieren. Das Steuer-Applet kann dann z.B. dein "Hardware"-Applet nach einer beliebigen Wartezeit neu in den den anzeigenden Frame laden.

Ich denke, dass das funktioniert, wenn das Browser-Fenster nicht ganz geschlossen wird, sondern nur eine Seite des Framesets.


----------



## Empire Phoenix (29. Jan 2009)

Was evtl auch ghet, wäre die Stop() bzw destroy() methode mit sinnlosen calculationen verlängern, weiß aber nicht wie die Browser darauf reagieren werden.

Ansonsten kann ich dir empfehlen Webstart mal anzugucken, was zumindest evtl. (je nach verwendeter Hardware) ne Idee wäre.


----------



## L-ectron-X (29. Jan 2009)

Empire Phoenix hat gesagt.:
			
		

> Was evtl auch ghet, wäre die Stop() bzw destroy() methode mit sinnlosen calculationen verlängern, weiß aber nicht wie die Browser darauf reagieren werden.


Das würde am Problem nichts ändern, weil das Applet ja neu gestartet/initialisiert werden muss. Und das funktioniert wohl nicht, so lange der Port durch ein noch laufendes Applet belegt ist...
Die von mir vorgeschlagene Variante sollte schon funktionieren.


----------

