Schrift
[thread]8568[/thread]

Socket's und AJAX & Co.

Leser: 2


<< >> 10 Einträge, 1 Seite
Froschpopo
 2006-12-09 14:01
#72429 #72429
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich hab hier nen kleinen Chatserver gebastelt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use strict;
use IO::Socket::INET;
use IO::Select;

my $server = IO::Socket::INET->new(LocalPort => 8000, type=>SOCK_STREAM, Reuse=>1, Listen=>10) or die $@;

my $select = IO::Select->new($server);

while (my @readable = $select->can_read()) {
for my $socket (@readable) {
if ($socket == $server) {
my $client = $socket->accept();
print "$client ist der neue Client\n";
$select->add($client);
next;
} else {
my $line = $socket->getline();
#requests verarbeiten
}
}
}
#und so weiter


Der Server basiert auf der Architektur des TCP-Servers aus dem Kochbuch (2. Auflage).
Damit ihr nicht mit soviel Code überfordert seid, habe ich mich auf das nötigste beschränkt. Dann wisst ihr wie es ungefähr aufgebaut ist. Ich will hier aber garnicht weiter auf den Code eingehen.
Vielmehr geht es um folgendes:
Die Idee war damals, etwas zu basteln, worauf man nahezu aus allem einen Client bauen kann was in der Lage ist eine Socketverbindung einzugehen. Ich habe also Clients in Java und Tk gebaut.
Mittlerweile gibts aber eine neue Technik die mich sehr interessiert und der ich viel Zukunft zumesse, nämlich AJAX.
Allerdings ist AJAX alles andere als mit Java oder Flash vergleichbar. Die Idee, von der ich damals annahm, man könne einmal einen Server bauen und dann kann man alle paar Jahre mal einen Client bauen der dem aktuellen Stand der technik entspricht. Ganz früher war es Java. Vor 1 Jahr habe ich dann einen mit Flash gebaut. Jetzt scheint AJAX der Trend zu sein und es sieht so aus, als müsste ich mir Gedanken um die Serverarchitektur machen.
Wie seht ihr das und was denkt ihr, wie könnte man das o.g. Beispiel auch für techniken wie AJAX verfügbar machen?
ptk
 2006-12-09 14:19
#72430 #72430
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man muss nicht unbedingt einen eigenen Server für AJAX schreiben. Ein normaler Apache tut es auch.
Froschpopo
 2006-12-09 15:25
#72431 #72431
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,09.12.2006, 13:19]Man muss nicht unbedingt einen eigenen Server für AJAX schreiben. Ein normaler Apache tut es auch.[/quote]
Mit dem Apache einen Chatserver zu betreiben ist meiner Erfahrung nach alles andere als klug. Da hast du Prozesse die garnicht nötig sind.
Deshalb mein kleiner Chatserver, der nur enthält was auch tatsächlich gebraucht wird.
Eines kann man diesem Socketchat nicht nehmen: Er ist in Verbindung mit einem Fork für jedes Socket verdammt schnell. Schneller als jeder CGI-Chat der ständig HTTP-Requests neu schicken muss (mit Header, HTML usw.). Er muss sich auch nicht ständig reloaden und läuft benötigt auch keine Salat-Lösungen wie Serverpush.
Es ist ja kein Problem aus dem Chatserver einen kleinen Webserver zu basteln. Das Problem ist aber die Frage: Wie bekomme ich es hin, dass der Client auf "Sendungen vom Server wartet" (!) ?
Das geht also nur, wenn der Request nicht vollständig abgeschlossen wird, ODER das Client-"Dokument" irgendwie von sich aus mit dem Server kontakt aufnehmen kann.
Denn normalerweise gilt ja die Kommunikation zwischen Client und Server nach Übermittlung des Dokumentes als abgeschlossen.
Mit Java kann ich aber ein Socket zum Server bauen, das diet Verbindung trotz abgeschlossenem HTTP-Request aufrecht erhält!
Leider dauert es immer eine gewisse Zeit, bis das Applet übertragen und gestartet ist.
Was gibt es für alternativen für mich?
ptk
 2006-12-09 17:45
#72432 #72432
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mit AJAX schickst du ganz normale HTTP-Requests an einen Server. Die "Innovation" ist ja nur, dass man es direkt aus dem Javascript heraus machen kann und das Ergebnis asynchron einsammeln kann. Dadurch entsteht die Möglichkeit, richtige "Anwendungen" zu bauen ohne ein Page-Reload machen zu müssen (was schon früher mit schmutzigen Tricks möglich war). Ob du nun auch Optimierungen à la Connection:keep-alive machen kannst oder der Browser das für dich erledigt, müsstest du selbst untersuchen.
topeg
 2006-12-09 17:48
#72433 #72433
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Theoretisch klannst du mit Javascript Daten von einem Server holen (XMLHttpRequest). Nur unterbinden die meisten Browser jede andere Verbindung als zu dem von dem das Javascript stammt. Du müsstest allso einen kleinen Werbserver (winzigen) schreiben/einbinden der eine HTMLSeite mit jenem enthaltenen Javascript ausliefern kann und auf dem selben Rechner (selbe IP) läuft wie das Chatprogramm, dabei ist der Port über das das HTML ausgeliefet wird unwesendlich.
Froschpopo
 2006-12-14 10:47
#72434 #72434
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Erstmal danke für die rege Beteiligung!

Zum Thema XMLHttpRequest: Das blöde daran ist ja, dass der Server keineswegs geschont wird. Der Reload-Intervall findet ganz normal statt, lediglich die Ausgabe im Browser wird unterdrückt.
Irgendwie muss man sich an diese Denkweise sehr gewöhnen, was mir schwer fällt.
Ich könnte theoretisch meinen alten Tk Client durch ein Java oder Flash-Frontend ersetzen. Wie würdet Ihr handeln?
topeg
 2006-12-14 22:30
#72435 #72435
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Der Client verbindet sich doch auch immer wieder mit dem Server um die Nachrichten zu senden oder zu empfangen, oder machst du die Kommunikation direckt zwischen den Chatenden?

Ganz entgegen dem Namen kannst mit "XMLHttpRequest" beliebige Daten von beliebigen Ports holen.
esskar
 2006-12-15 01:37
#72436 #72436
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich kenn ne lösung, die mit http-responses ohne content-length arbeitet. man hat z.b. img-tag, dass ein script anfordert.
dieses script erzeugt eine http-response ohne content-length und benutzt HTTP/1.0 als http version. dadurch weiß der browser nicht, wie groß das bild wird, und man schickt ihm immer mal was, damit kein timeout kommt passiert. so hält man die socket-verbindung schön offen (der server muss das natülcih auch handeln können). jetzt kann man geschickt mit javascript error handlern arbeiten, um mit dem server zu kommunizieren und daten auszutauschen.
hab den genauen ablauf nicht mehr im kopf, aber wir ( mein alter arbeitgeber dialogika ( PhoneDialog ) ) haben das system für ne CTI SAP Lösung entwickelt und das verfahren ist patentiert (hat mich einen morgen gekostet um die lösung rauszuspielen :-( ), siehe: http://www.pressebox.de/pressem....24.html\n\n

<!--EDIT|esskar|1166139616-->
Froschpopo
 2006-12-15 18:01
#72437 #72437
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=topeg,14.12.2006, 21:30]Der Client verbindet sich doch auch immer wieder mit dem Server um die Nachrichten zu senden oder zu empfangen, oder machst du die Kommunikation direckt zwischen den Chatenden?

Ganz entgegen dem Namen kannst mit "XMLHttpRequest" beliebige Daten von beliebigen Ports holen.[/quote]
meine bisherige Lösung arbeitet eben nicht mit einem Intervall und ist nicht zuletzt dadurch schneller, weil nicht der nächste Punkt abgewartet werden muss.
(siehe Code oben)
Ich würde am liebsten alles mit Flash lösen. Aber so bedeutsam wird der Chat nicht sein, als dass sich die Investitionskosten für Flash lohnen würden. Ansonsten enthält Flash nämlich genau diese Technik die ich gern hätte.
Froschpopo
 2006-12-15 18:16
#72438 #72438
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ok also um das ganze mal zum Schluss zu bringen: Ich versuchs einfach mal mit AJAX. D.h. in nächster Zeit ist hier wieder etwas mehr los ;)
<< >> 10 Einträge, 1 Seite



View all threads created 2006-12-09 14:01.