Ajax - Auf Antwort warten

PatrickB

Well-known member
ID: 137508
L
24 April 2006
496
13
Hallo,

ich bin gerade dabei einen Chat mittels Ajax zu realisieren.
Damit im Chatfenster im die aktuellen Gesprächsdaten sind muss ich ja immer einen Request machen um abzufragen ob mein Gegenüber mir was neues geschrieben hat. Also hab ich jetzt ein setTimeout erstellt und sende so alle paar Sekunden einen Request der das prüft.

Ist das so aber sinvoll?
Bei Schülervz beispielsweiße wird ein Request gesendet der so lange läuft bis eine Antwort kommt. Aber wie mache ich das?

Danke schonmal,

Gruß Patrick
 
Bei Schülervz beispielsweiße wird ein Request gesendet der so lange läuft bis eine Antwort kommt. Aber wie mache ich das?
Ein Request wird gesendet. Bei AJAX wartest du asynchron auf die Response.

Wenn du die Response erst bei der nächsten neuen Nachricht haben willst, musst du halt auf dem Server die Bearbeitung des Requests solange hinauszögern, bis was da is.

Ich warne dich aber :!:: Ein Server nimmt maximal x Verbindung an. Wenn du die Verbindungen ewig hältst und nicht bearbeitest, werden nachfolgende Clients ignoriert.
Wenn du das auf deinem eigenen Server machst, werden deine Webseiten nicht mehr erreichbar sein, wenn genügend Leute im Chat sind. Wenn du normalen Webspace benutzt, schießt dir der Provider deine Scripte nach 30 Sekunden oder so ab, weil andere Leute ja auch drankommen wollen.

Diese Technik scheint also nicht besonders effektiv zu sein.
 
Auch nicht grade toll, aber immer hin besser. Kommt halt auf den Server an, was er aushält, wie er konfiguriert und wie er genutzt wird. Das musst du wissen.
Wenn du dich kurzfasst und nicht 100 Verbindungen pro Sekunde auf die Kiste draufrasseln lässt, geht das zumindest.
 
Auch nicht grade toll, aber immer hin besser. Kommt halt auf den Server an, was er aushält, wie er konfiguriert und wie er genutzt wird. Das musst du wissen.
Wenn du dich kurzfasst und nicht 100 Verbindungen pro Sekunde auf die Kiste draufrasseln lässt, geht das zumindest.

Was wäre denn dann die alternative dazu?
Im Moment mache ich für alle offenen Fenster nur alle 2 Sekunden einen Request
 
Also das warten bis eine neue Antwort da ist, war damals so revolutionaer dass sie ihm sogar einen eigenen Namen gegeben haben: Comet.
Es macht es moeglich eine Server Side Push operation zu emulieren, hat aber wie theHacker schon gesagt hat zu einigen Problemen gefuehrt. Besonders klassische Web server verbraten eine Menge resourcen um eine Anfrage zu beantworten, somit is im null komma nichts dein server nur noch am rumkriechen.
Sollte es wirklich unabdingbar sein kann man auf extra dafuer programmierte server zurueckgreifen, was aber nur in extremfaellen empfehlbar ist, weil dank der Same-Origin policy einiges an rumkonfigurierei noetig ist um die Anfragen auf den Comet server zu schalten und alle anderen auf den normalen webserver.

Zu dem thema giebt's relativ viele infos, hier z.B. eine Slideshow: https://www.slideshare.net/techdude/comet-for-highly-scalable-applications
 
Ok, danke für den Link.
Ich benutze die Chats im Moment sowieso noch nicht für ein großes Projekt. Also da sind dann vll maximal 10 Fenster gleichzeitig offen. Bei der Größenordnund ist das mit dem timeout denk ich noch ok.
 
Irgendwo bin ich sogar mal ueber eine fertige Loesung gestolpert in der man einen Jabber Server mit Comet in einem bekommen hat, wenn ich den finde pack ich den Link hier rein :)
 
Sollte es wirklich unabdingbar sein kann man auf extra dafuer programmierte server zurueckgreifen, was aber nur in extremfaellen empfehlbar ist ...

der Server muss nur eine sinnvolle Architektur haben.
Jetty Continuations, nginx push mode.

Und schwer ist es auch nicht, man setzt einfach einen solchen Server vor den Apache, und proxyt damit alle Requests bis auf die Comet oder Long-Polling-Anfragen.
 
Und schwer ist es auch nicht, man setzt einfach einen solchen Server vor den Apache, und proxyt damit alle Requests bis auf die Comet oder Long-Polling-Anfragen.
Joa, meine Worte musste ich nach kurzem suchen selber wieder runterschlucken, so schwer isses wirklich nicht, aber es benoetigt immer noch dass du selber den Server managen kannst, also entweder du kuemmerst dich selber drum und hast volle kontrolle ueber was passiert oder du bestellst einen vhost. Ein normaler hosting plan wird's nicht wuppen, das wollte ich damit sagen :evil:
 
Interessant mit dieser Programmiertechnik. Aber auch eigentlich ganz logisch.. Hatte mich schon gewundert wie Dienste wie meebo.com funktionieren und da läuft es identisch ab wie ich durch Firebug erkennen kann.
Die Idee mit einem Server davorschalten der nicht-Comet-Requests einfach durchwinkt hört sich auch schon mal gut an...

Könnte es in dafür nicht sogar schon fertige Server geben? Eventuell weiß einer da ja was.. Sourceforge oder so könnte man ja mal durchwühlen.
Denn neu ist das ganze dann ja nun nicht wenn es schon den Begriff 'Comet' für diese Art der Programmierung gibt.
 
Jeder Server, der das C10k Problem lösen will und ein Modul für sowas hat, ist dafür geeignet.
Am prominentesten ist denke ich momentan Jetty mit seiner Continuation API.

Cometd mit seiner Bayeux-API (aufbauend auf Jetty) hat glaube ich sogar die Möglichkeit mit PHP die Verbindungen zu füttern.
Also das die Verbindungen in echt an eine Java-Klasse gehen, diese aber wartet bis ein PHP-Script beim Webserver per Sockets Daten für einen Client hinterlegt.
Hab nur mal nebenbei was drüber gelesen und nicht genau angesehen, ich persönlich würde bei sowas dann eh direkt auf Jetty setzen.

Edit: Bayeux Client API ;)
Da es auf einen HTTP-Request zum Abliefern aufbaut, sollte man das auch mit PHP machen können.