Hallo Thomas,
habe den Thread gelesen.... hmmmm ..... !
Die Arbeit ist sehr aufwendig hier noch ein Java Applet einzubauen .... vielmehr zusätzlich eine PHP Socket to Java Applet Kommunikation. Wesentlich schneller kommst du mit der Pushlet Technologie weiter !
Du willst versuchen eine HTML Seite oder Projekt mit Live Daten zu versorgen !
Das ursächliche Problem ist das ein HTTP Client(Browser) nicht die Möglichkeit bietet auf Verbindungen zu lauschen um auf requests zu antworten!
Die ständige Nachfrage des Clients nach neuen Daten ist hier, so wie es zunächst aussieht, eine mögliche Lösung des Problems ("polling").
Der Nachteil ist die Lasst des Servers ! Hier kommen innerhalb bestimmter Zeitabstände requests(Anfragen) herein. Wenn man sich dafür entscheidet damit zu arbeiten solltest du eine "Cache" Funktion in dein PHP Script einbauen um zu verhindern das bei jedem Aufruf des main Scriptes die Datenbank belastet wird, auch wenn keine neuen Daten vorliegen.
Einen neuen Output nur senden wenn auch wirklich neue Daten vorliegen!
Das lässt sich sehr gut mit den HTTP Headern erledigen die dem Client anhand des (last mod) Headers sagen das die Seite sich nicht verändert hat. So wird kein zusätzlicher Traffic erzeugt und der Client verarbeitet die HTML Seite aus dem lokalen Browser-Cache.
Eine weitere Möglichkeit ist das "pushen" (Java Pushlet)!
Über JavaScript bietet sich die Möglichkeit einen Kommunikationskanal offen zu halten. (Socket)
Der Browser öffnet einen Socket zum Server - und sendet eine Anfrage(request) - der Server antwortet(response) - und der Socket wird geschlossen! Hier liegt die Möglichkeit..... zwar wird hier das HTTP Protokoll ein bischen vergewaltigt..... aber es funktioniert.
Dieser Socket muss geöffnet bleiben ! .... also kein close() [wenn es das in PHP gibt ???]
Dadurch kannst du nach und nach Daten in den Stream schreiben. Das wird z.B. bei HTML Chat Systemen genutzt. Ich schreibe Daten in den StreamBuffer und drücke diese dann über flush() an den Client.
Da der Browser(Client) in der Erwartung ist das hier noch Daten kommen , da der Socket vom Server noch offen ist, hast du schon mal einen Kommunikationskanal um Daten an den Client(Browser) zu senden.
Nun kommt JavaScript und Frames ins Spiel !
Diesen Kommunikationskanal kann man nutzen um dem Browser ein paar Zeilen JavaScript zu senden. Da der JavaScript Interpreter des Browser diese Zeilen sofort interpretiert, kann man hierüber Daten an einen anderen Frame senden und entsprechende Events, Funktionen auslösen.
Sagen wir du nutzt einen hidden Frame (nicht sichtbar) um hiermit (z.B. src="stream.php") den Kommunikationskanal aufzubauen.
Im Frame den du nutzt um dem User deine Daten anzuzeigen nennen wir mal display.htm!
Du kannst nun im Frameset einige Javascript Funktionen definieren! (z.B. push() {..da kommt was vom Server} )
Wenn du nun in deinem Kommunikationskanal(src="stream.php")
<script type="text/javascript">
<!--
parent.push("bla bla");
//-->
</script>
an den Client(Browser) sendest wird die entsprechende Funktion im Frameset ausgelöst!!!
Die Funktion könnte so aussehen:
<script LANGUAGE="JavaScript">
var pageStart="<HTML><HEAD></HEAD><BODY><H2>Server pushes: <P>";
var pageEnd="</H2></BODY></HTML>";
function push(content) {
// zeigt im displayFrame (display.htm) die neuen Infos an !
window.frames['displayFrame'].document.writeln(pageStart+content+pageEnd);
window.frames['displayFrame'].document.close();
}
</script>
Viel Spass beim basteln !!!! Leider habe ich wenig mit PHP am HUT und arbeite selbst mit Java und allem was dazu gehört. Aber bei der Durchsetzung mit PHP gibt es hier auch einige Profis die dir da weiterhelfen können.
Einige wichtige Punkte noch:
1.Der Browser arbeitet mit einem Timeout! Meint ... wenn eine lange Zeit nix vom Server mehr über diesen Socket gesendet wurde, macht der Browser den Socket dicht. Das kann dadurch verhindert werden, imdem man einen Ping sendet. Meint wiederum irgendwelche Dummydaten in bestimmten Abständen wenn keine Daten geflossen sind!
2.Die Browser haben unterschiedliche Buffer und halten dort Daten fest bis der Buffer voll ist. Erst dann wird dieser Teil gerendert oder dem JavaScript Interpreter übergeben. Das passiert meist nur beim ersten Laden der HTML Seite. Eine einfache Lösung ist hier die Schwelle in Erfahrung zu bringen. Betroffen ist der Kommunikationskanal "stream.php" !!! Es reicht ein paar Zeilen am Anfang zu senden die ehh keiner zu sehen bekommt. ( <h1>.................... bufferkiller ....<h1> )
Zwei drei lange Zeilen dieser Art sollten ausreichen bevor der erste JavaScript Block gesendet wird.
2b. Wesentlich eleganter ist allerdings das senden eines Ping() ! Das wird so oft gesendet bis ein Event ausgelöst wird und der Client uns über z.B. writeln("<img src='server/ClientComIsOpen'>") signalisiert das mit dem Kommunikationskanal alles OK ist! Ebenfalls zu empf. wegen CrossBrowser bla... !
So jetzt reichts aber ... hab keine Lust mehr ;-)
Viel Spass beim Basteln !
Gruesse
code2i