kerstin: chat

Habe einen äußerst simplen Chat in PHP geschrieben, der eine Textdatei ausliest, und neue Einträge unten einfügt. Im Browser lädt sich die Seite alle  paar Sekunden neu.
Das nervt natürlich. Gibt es eine Möglichkeit, mit PHP oder Perl oder wenns nicht zu schwer zu blicken ist, auch mit Java einen ähnlich simplen Chat zu bauen, der ohne ständiges Neuladen funktioniert?
Habe von einer Möglichkeit in Perl gehört, bei der der Browser die Verbindung zum Server offen hält, nur funktioniert das beim Windows 2000 Server nicht.

Bin für alle Anregungen dankbar!

( Grüße an alle Linkhunters, Hinweis 1: Sagmal!, Hinweis 2: Gattung der Kuhantilopen in den Steppen Ost- und Südafrikas; 1,7 bis 2,4m lang, Schulterhöhe 0,7 bis 1,5m; hakig gebogene Hörner; kurzes, glattes Fell; Mähne )

  1. Habe einen äußerst simplen Chat in PHP geschrieben, der eine Textdatei ausliest, und neue Einträge unten einfügt. Im Browser lädt sich die Seite alle  paar Sekunden neu.
    Das nervt natürlich. Gibt es eine Möglichkeit, mit PHP oder Perl oder wenns nicht zu schwer zu blicken ist, auch mit Java einen ähnlich simplen Chat zu bauen, der ohne ständiges Neuladen funktioniert?

    HTTP ist für dauerhafte Verbindungen die denkbar ungünstigste Wahl, weil es per Definition ein verbindungsloses Protokoll ist, d.h. für jede Übertragung wird eine neue Verbindung aufgebaut. Dementsprechend befriedigend ist dann ja auch Dein PHP-Ergebnis ausgefallen.
    Dementsprechend befriedigend ist dann ja auch Dein PHP-Ergebnis ausgefallen, da neue Daten vom Server nicht sofort (über die bestehende Verbindung) übertragen werden können, sondern der Client zwangsläufig auf Verdacht hin alle Nase lang beim Server anfragen muß.

    Möchtest Du es besser machen, brauchst Du eine Möglichkeit, direkt vom Server aus bei Bedarf Daten an den Client zu senden. Du brauchst also am sinnvollsten a) einen Server, der _nicht_ auf dem verbindungslosen HTTP basiert, und b) am anderen Ende natürlich auch einen Client, der Dein gewähltes Protokoll unterstützt.

    Auf Serverseite bist Du mit PHP in dieser Hinsicht ziemlich aufgeschmissen, weil in der Regel die Laufzeit der Skripte auf wenige Minuten beschränkt ist - an einen ständig laufenden Server bzw. offen gehaltene Verbindungen ist da nicht zu denken.
    Mit Perl wird das schon eher was, weil Perl-Skripte als eigenständige Programme laufen; ich könnte mir allerdings vorstellen, daß Dein Hoster etwas dagegen hat, wenn Du eigenmächtigerweise stundenlange Verbindungen offen hälst.

    Auf Clientseite könnte sich tatsächlich etwas mit Javascript über HTTP machen lassen. Der Browser bekäme quasi eine endlose Seite übertragen; die neuen Nachrichten werden am "Ende" dieser Seite als Javascript-Befehle gesendet, die die Daten in ein Textfeld o.ä. eintragen. Ob das funktioniert, weiß ich nicht.

    Mit Java könnte man einen Client programmieren, der beim Aufruf lediglich die Adressen der derzeit beteiligten Rechner bekommt und dann von sich aus Verbindungen mit diesen Rechnern herstellt. Der Server dient in dem Sinne nur noch als Buchhaltung über angemeldete Rechner. Diese Lösung hat allerdings große Stolpersteine, Probleme bei der Abmeldung vom Server und Firewalls auf den Anwenderrechnern fallen mir da ein.

    Und somit kommen wir zur berühmten Frage: Warum das Rad neu erfinden? Es gibt seit bald 14 Jahren ein Chatprotokoll, das mit hunderten von ständig erreichbaren Servern weltweit in einem Dutzend Netze von tausenden gleichzeitig genutzt wird: IRC (http://irchelp.org/). Clients gibt es dafür zuhauf, eigenständige wie mIRC oder xircon und auch systemunabhängige Java-Applets für Webbrowser.

    Der SelfChat funktioniert auch damit, schau mal rein: http://aktuell.de.selfhtml.org/live/chat.htm.

    Gruß,
      soenk.e

    1. Hallo,

      man könnte auch mit HTTP und Frames und JavaScript arbeiten.

      In einem blinden Frame wird vom Client per JavaScript immer wieder eine Seite angefordert. Die gesendeten Daten werden dann in das sichtbare Frame in eine Textarea, oder bei neueren Browswern auch als Inlinetext übertragen.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
      1. Hi Tom,

        man könnte auch mit HTTP und Frames und JavaScript arbeiten.

        Klar könnte man. Ich habe Sönke jedoch so verstanden, und da sind wir denke ich einer Meinung, dass es nicht gerade _sinnvoll_ ist ;-)

        In einem blinden Frame wird vom Client per JavaScript immer wieder eine Seite angefordert. Die gesendeten Daten werden dann in das sichtbare Frame in eine Textarea, oder bei neueren Browswern auch als Inlinetext übertragen.

        Habe das ganze vor geraumer Zeit mal ausprobiert, als ich "glaubte, dass PHP alles kann"[tm]. Das einige Resultat war ein Wust von sinnlosem Traffic, was ich heute allerdings durch einen HTTP-304-Header ausmerzen würde. Auf dieser Basis denke ich ließe sich das was machen.

        Adventsgrüße nach Braunschweig,
        Fabian

        1. Hmm... vielen Dank erst mal für die Hilfe. Weiß jetzt zumindest, wie ich nicht weiter rumprobieren sollte, das ist ja auch schon was! Das mit dem IRC ist mir glaub zu hoch, außerdem funktioniert der selfHTML chat bei mir komischerweise nicht - mein Explorer schmirgelt ab. Ich werde also eher in Richtung Perl weiterprobieren, mein Hoster kann sich glücklicherweise nicht beschweren... hoste mich sozusagen selbst. Es reicht auch, wenn der chat c.a. 1-2 Stunden gut läuft, ich brauchen ihn für ein realtime-game.

          THX, kerstin

          1. Hi

            Hmm... vielen Dank erst mal für die Hilfe. Weiß jetzt zumindest, wie ich nicht weiter rumprobieren sollte, das ist ja auch schon was! Das mit dem IRC ist mir glaub zu hoch, außerdem funktioniert der selfHTML chat bei mir komischerweise nicht - mein Explorer schmirgelt ab. Ich werde also eher in Richtung Perl weiterprobieren, mein Hoster kann sich glücklicherweise nicht beschweren... hoste mich sozusagen selbst. Es reicht auch, wenn der chat c.a. 1-2 Stunden gut läuft, ich brauchen ihn für ein realtime-game.

            Wenn das so ist kannst du natürlich noch viel tollere Sachen machen, zum Beipsiel wirklich alle zwei Stunden resetten oder so. Melde dich  dann mal, wenn du es fertig hast, ich bin gespannt, wie das geht. Ich betone nochmals, dass PHP zwar nicht sinnvoll ist, aber dass es schon möglich sein müsste. ;-)

            Fabian