#1 28. November 2010 Cometd / node.js & socket.io und Co Hallo, wollte mal fragen ob sich jemand mit den genannten Techniken auskennt! Ich hab sowas in der Art vor wie bei facebook, sprich wenn jemand zum Beispiel ein Bild von mir kommentiert, erscheint ein Overlay in dem mir mitgeteilt wird das jemand mein Bild kommentiert hat! Hab mir schon ein paar Seiten angeschaut aber das Thema ist mir aktuell etwas strange! + Multi-Zitat Zitieren
#2 4. Dezember 2010 AW: Cometd / node.js & socket.io und Co Sorry aber ich muss mal pushen. Kann doch nicht sein das davon keiner Ahnung hat! ;( Murdoc? Hacker5? Macht mich glücklich!!! Jeder andere User ist natürlich auch gefragt! + Multi-Zitat Zitieren
#3 5. Dezember 2010 AW: Cometd / node.js & socket.io und Co das ist ein wenig zu komplex um mal eben zu erklären wie das funktioniert ^^ soweit ich das gesehen hab kannst du mit den sachen eine permanente verbindung zu deinem webserver aufbauen und dann messages die der server übermittelt abarbeiten. hast du schonmal was mit irc gemacht? damit bekommst du einiges an grundwissen mit, was dir später bei solchen sachen enorm hilft. vielleicht reicht dir ja schon der unterschied zwischen socket.io und ajax: ajax: mit ajax geht die anfrage "was gibts neues" immer vom client aus. d.h. du musst in einem intervall stänig beim server nachfragen. das bringt natürlich einiges an overhead, da jede neue anfrage individuell behandelt wird. socket.io: mit socket.io fällt diese anfrage weg, denn nun teilt der server dir mit wenn es was neues gibt. diese "technologie" kann man mit sog. "WebSockets" realisieren. d.h. eine permanente verbindung zum server, welcher dir immer, wenn es was neues gibt, daten ausspuckt mit denen du arbeiten kannst. im zend-framework findest du fertige klassen um so einen server zu programmieren. falls du dieses framework nicht verwendest tuts auch eine endlosschleife mit einer callback-funktion und nem sleep. PHP: while( true ) { prüfen_obs_was_neues_gibt (); flush (); // wichtig, sonst kommt nix am client an sleep ( 1 ); // eine sek. warten } in der funktion "prüfen_obs_was_neues_gibt" checkst du dann deine db ob neue kommentare vorhanden sind und gibst die so formatiert aus, dass socket.io es versteht, verarbeitet und in nem event an deine funktionen übergibt. diesbezüglich bin ich leider auch nicht so bewandert, es sollte sich aber was in der doku finden lassen. meine persönliche meinung: sehr schön, aber noch in den kinderschuhen. ich würde das lieber selbst programmieren und auf fähige HTML5 browser beschränken, denn socket.io versucht alle möglichen technologien zu verwenden wie z.b. iframes, swf und noch einiges mehr -> was halt zur verfügung steht. mehr informationen zu WebSockets findest du hier: WebSockets in Firefox ✩ Mozilla Hacks – the Web developer blog + Multi-Zitat Zitieren
#4 5. Dezember 2010 AW: Cometd / node.js & socket.io und Co Das ist ja die Sache! Also was was ajax macht und was Cometd / node.js & socket.io und Co machen ist mir im Kern bewusst! Mein Problem ist halt das ich diverse "Beispiele" beliebäugelt habe die aus irgend einem Grund trotzdem alle paar Sekunden einen Request an den Server geschickt haben, das hat mich verwirrt da man das mit diesen Techniken ja eben verhindern möchte ... Soweit ich das mitbekommen habe ist ja in allen Browsern bis auf dem IE diese Long polling Geschichte möglich sprich 1 Request dahinter ein Skript in Endlosschleife und das wird von dem Javascript halt verarbeitet ... Beim IE soll es ja nur mit einem Workaround like Forever Iframe möglich sein ... Notfalls muss man es wirklich auf fähige Browser beschränken! + Multi-Zitat Zitieren
#5 5. Dezember 2010 AW: Cometd / node.js & socket.io und Co Vielleicht hilft die ja das: gimite/web-socket-js · GitHub Oder Home | jWebSocket <-- sieht noch besser aus (beide in den Comments über Murdocs Link). Glaube da gibt es schon ganz coole Dinger. Musst nur mal durchtesten + Multi-Zitat Zitieren
#6 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Danke! Ich hab da noch zwei Probleme! 1.) Ich habe grundsätzlich verstanden wie die Techniken arbeiten, mein Problem jetzt ist die Überlegung wie User nur die Meldungen zu sehen bekommen die für sie gedacht sind. Sprich, normal senden die "Socket Server" die Informationen ja an alle Clients ... Was ist aber wenn ich jetzt einem User zum Beispiel anzeigen möchte das eines seiner Bilder kommentiert wurde? Ich meine ich kann mir schon vorstellen wie man das macht, aber mein Hirn geht leider in den Leerlauf wenn Sachen etwas zu kompliziert sind! ^^ 2.) gimite/web-socket-js · GitHub hab ich mir mal besorgt und eine Test Umgebung aufgebaut ... Die Sache läuft im Chrome runder wie eine Eier Uhr ... Im Firefox läuft sie auch, nur leider macht da die Web Socket Policy von Flash Theater ... Die soll laut Readme hinter dem Port 8xx liegen im Firefox sagt er mir aber das er die hinter 8xx nicht findet ... (Sprich bis die Anwendung läuft dauert es ca. 1 Minute) Ich kann mir das nur so erklären das die System Flash Version nicht hinter 8xx schaut die von Chrome Flash Version dagegen schon ... Jemand eine Idee? LG + Multi-Zitat Zitieren
#7 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co das wäre fatal wenn das so wäre. du musst deinen server schon so programmieren, dass informationen nur an die user rausgehen die was damit zu tun haben. andernfalls könnte man im client dein script so weit modifizieren, dass man alle sachen einfach mitloggt die einem vielleicht garnichts angehen. der server sendet ja nicht nur,m sondern kann auch empfangen. am besten du baust so eine art "auth" ein um die benutzer zu identifizieren. ich kann dir auch sagen warum das ganze in chrome so gut läuft: in chrome gibt es bereits WebSockets in javascript (und damit ist das ganze ein kinderspiel), in firefox 3.6 nicht - erst ab firefox 4. ich würde dir raten, das ganze wirklich auf html5-fähige browser zu beschränken. im internet findet gerade ein großer wandel statt und du solltest lieber zu den neuen techniken wecheln anstatt zu versuchen diese sachen in alten browser zu imitieren. mit WebSockets hast du alles bei der hand was du brauchst, auch ohne socket.io und du kannst du komplett auf die programmierung konzentrieren anstatt auf workarounds. + Multi-Zitat Zitieren
#8 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Stimmt auch irgendwie! Wenn die User neue Features nutzen wollen müssen sie halt schauen das sie vom IE 6 wegkommen! Danke + Multi-Zitat Zitieren
#9 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co ich persönlich würde firefox 4 seit der ersten beta verwenden, aber leider stimmt bei mir das schriftbild überhaupt nicht - vorallem wenn ich die hardwarebeschleunigung abstelle erkenne ich fast nichts mehr - schade eigl. denn die neue ui und die ganzen funktionen sind eigl. sehr überzeugend. aber das ist ein anderes thema bis zum stabilen release von firefox musst du halt mit chrome arbeiten. der code sollte sich anschließen 1:1 für firefox4 übernehmen lassen. und da du eh nicht für den ie programmierst, kannst du ja mal die schönen sprachfeatures von ecma 3/4/5 nutzen, wie z.b. konstanten, labels, getter/setter, generator-pattern usw. ist sicher mal interessant für dich was so alles mögliche wäre wenn MS grad bei javascript nicht ihr eigenes ding drehen würden ps ab ie9 sollten diese sachen auch im ie funktionieren. + Multi-Zitat Zitieren
#10 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co IE wäre schon nicht schlecht, meinst du beim IE würde der Code irgendwann (eventuell auch mit ein kleinem bissel Hilfe) laufen? + Multi-Zitat Zitieren
#11 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co ein auf WebSockets basierende duplex verbindung inkl. server wär vielleicht was für das gemeinsame projekt, anstatt ein cms lieber was sinnvolles ^^ + Multi-Zitat Zitieren
#12 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Affenpopo Server ... Was kann man überhaupt alles dahinter packen? Hab ja diesen Websocket Ruby Server gefunden ... Schlecht nur ich kann weder Ruby / Python noch sonst was! xD Gibt es für diese Spielerei keine einfache Lösung? Ich will doch einfach nur Usern sagen "Hey, der x der hat dein Bild x kommentiert" Kann doch nicht so schwer sein! :shock: Und wegen Auth, wenn es da eine reine PHP Lösung geben würde könnte man ja mit der Session arbeiten ... Und manche Implementierungen wie glaube socket.io arbeiten ja mit Handshakes, sowas müsste man dann nachbauen ... Wobei ich mich frage ... Naja an sich nur an die Meldungen des Users kommen wäre ja recht einfach ... Zum Beispiel über ... ws://127.0.0.1:8080/stream/{user_id oder user_key oder so} Aber wäre halt nicht sicher, sprich manipulierbar ... Was weiß ike, kann man einen auf Web Sockets basierende duplex Verbindung ink. Server essen? Weiß net was du damit meinst! ^^ + Multi-Zitat Zitieren
#13 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co kannst auch mit php machen, die grundlagen siehst ja oben in der while(true) schleife von mir. ich weiß jetzt nicht genau wie das ganze von statten geht, aber vielleicht kannst du auch mit echten sockets arbeiten vernab von apache und co. das geht mit php nämlich auch ganz gut mit der socket-implementierung. also nen eigenen server programmieren und auf nen von dir bestimmten port horchen lassen. auch hier wären irc-kenntisse von vorteil, denn da bekommst du nämlich alles an wissen mit, was man so braucht für ne full-duplex kommunikation. und wie gesagt, im zend-framework findest du fertige klassen für ein solches vorhaben. kurz erklärt: dein script läuft in einer endlosschleife und horcht via socket an einem bestimmten port nach eingehenden verbindungen. da die schleife alles blockieren würde musst du nen daemon aus deinem script machen. -> *nix: pcntl_fork() -> win: dein script mit einem "&" am ende starten, dann läufts im hintergrund. wichtig dabei ist, dass du nicht den kompletten apachen in den hintergrund forkst, sondern nur den php-interpreter. du könntest aber auch den apachen zusätzlich an nem anderen port lauschen lassen, aber das macht weniger spaß und frisst mehr ressourcen ^^ bei ruby und python hast halt den vorteil von threads. in php gibts sowas nicht auch nicht auf der cli, aber mit pcntl kannst wenigstens sowas ähnliches machen. denn damit dein eigener server reibunglos läuft brauchst du schon ein paar worker-daemons sonst wirds zu langsam. sowas alleine zu programmieren macht wenig bis garkeinen spaß und das debuggen is ne qual. vielleicht installierst einfach ruby oder python und probierst dein glück damit + Multi-Zitat Zitieren
#14 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Fände ich auf jeden Fall eine coole Sache. Gibt's bisser nichts wirklich innovatives (außerhalb des kommerziellen Bereichs). Pusher | HTML5 WebSocket Powered Realtime Messaging Service ist so ein kommerzielles Projekt, dass ziemlich gut aussieht. EDIT: Session in die Datenbank packen, dann ist es egal welche Sprache du für den Server benutzt, solange er auf dei DB zugreifen kann Schickst dann nur IP, Sessionkey an den Server und prüft mit DB + Multi-Zitat Zitieren
#15 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co ein einfacher sever (noch nich getestet, muss dazu php neu kompilieren ^^) so läuft! script starten und anschließend mit telnet mal verbinden Code: telnet localhost 9844 und mal "hello" eingeben + enter PHP: <? php $pid = pcntl_fork ();if( $pid > 0 ) exit; // brauchen wir nicht mehr if( $pid < 0 ) exit( 'fehler: konnte script nicht klonen' ); umask ( 0 ); pcntl_signal ( SIGTERM , 'handle_signal' ); pcntl_signal ( SIGINT , 'handle_signal' ); #pcntl_signal(SIGCHLD, 'handle_signal'); posix_setsid (); posix_setgid ( 65534 ); posix_setuid ( 65534 ); $socket = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );if(! $socket ) exit( 'fehler: socket_connect()' ); if(! socket_bind ( $socket , '127.0.0.1' , 9844 )) exit( 'fehler: socket_bind()' ); if(! socket_listen ( $socket )) exit( 'fehler: socket_listen()' ); socket_set_nonblock ( $socket ); $listen = true ; while( $listen === true ) { handle_connections ( $socket ); sleep ( 1 );} // -------------------------------------------- function shutdown (){ global $socket ; socket_close ( $socket ); exit;} function handle_connections ( $socket ){ $r = array( $socket ); $w = array( $socket ); $e = array( $socket ); if(@ socket_select ( $r , $w , $e , 60 ) != 1 ) return; $client = @ socket_accept ( $socket ); if( $client === false ) sleep ( 1 ); elseif( $client !== null ) handle_client ( $socket , $client );} function handle_client ( $socket , $client ){ $pid = pcntl_fork (); if( $pid == - 1 ) exit( 'fehler: konnte script nicht klonen' ); if( $pid > 0 ) { socket_close ( $client ); return; } global $listen ; $listen = false ; socket_close ( $socket ); handle_request ( $client ); socket_close ( $client );} function handle_request ( $client ){ $request = rtrim ( socket_read ( $client , 100000 , PHP_NORMAL_READ )); if( $request == 'hello' ) socket_write ( $client , 'hello world!' ); elseif( $request == 'exit' ) return; sleep ( 1 ); handle_request ( $client );} function handle_signal ( $sig ){ switch( $sig ) { case SIGTERM : case SIGINT : shutdown (); case SIGCHLD : $status = 0 ; pcntl_waitpid (- 1 , $status , WNOHANG ); shutdown (); }} // seh grad das mein server lauter kleine zombies erzeugt - mal sehen wo der fehler is ^^ behoben + Multi-Zitat Zitieren
#16 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Cool, hier geht es ja ab! Naja, Ruby hab ich schon drauf samt web-socket-ruby, Den Ruby Websocket Server müsste man dann halt nur an seine eigenen Bedürfnisse anpassen ... Habe aber auch schon Python Websocket Server gefunden, für mich interessanter da ich Python sowieso lernen wollte! Aber damit es erstmal läuft werde ich es wohl mit PHP machen! Eventuell bekommen wir hier ja noch was zustande! + Multi-Zitat Zitieren
#17 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co der server von mir funktioniert im übrigen. kannst das ja mal selbst probieren wenn du ne linux-box zur hand hast. + Multi-Zitat Zitieren
#18 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Mal schauen muss mir erst eine virtuelle Umgebung einrichten! Bist ein Schatz! Fetter Schmatzer von mir! *kuschel* + Multi-Zitat Zitieren
#19 6. Dezember 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Cometd / node.js & socket.io und Co hier in php5.3 oop: No File | www.xup.in im ordner "windows" ist ne version die du unter windows testen kannst. die konsole blockiert dann aber, d.h. deine anfagen musst du in einer separaten konsole ausführen ^^ zum modifizieren einfach die klasse lib/Client erweitern und bei Server::__construct() den namen deiner klasse übergeben starten musst du den server über die main.php PHP: php - f main . php beispiel für ne klasse die dem client alle 60sek mitteilt obs neue kommentare gibt: PHP: <? php namespace webs ; if(! class_exists ( '\webs\Base' )) require 'lib/Base.class.php' ; if(! class_exists ( '\webs\Client' )) require 'lib/Client.class.php' ; class MyClient extends Client { protected $isAuthed = false ; protected $lastCheck = 0 ; public function dispatch () { while( true ) { $input = $this -> readln (); if(!empty( $input )) { $input = json_decode ( $input , true ); switch( $input [ 'command' ]) { case 'auth' : $this -> auth ( $input [ 'username' ], $input [ 'token' ]); break; case 'quit' : return; } continue; } if( $this -> isAuthed ) $this -> update (); sleep ( 1 ); } } protected function update () { if( $this -> lastCheck > ( $time = time ()) - 60 ) return; $this -> lastCheck = $time ; // checken ob neue kommentare zu bildern vorhanden sind // ... } protected function auth ( $user , $token ) { if( $user == 'hans' && $token == sha1 ( 'geheim' )) { $this -> isAuthed = true ; return; } $this -> writeln ( 'login incorrect' ); }} die anfrage hab ich jetzt einfach mal mit json gemacht (kannst dir ja was anderes aussuchen) in der main.php dann einfach anpassen: PHP: $server = new webs :: Server ( '127.0.0.1' , 9844 , '\webs\MyClient' ); // :: mit \ ersetzen einfach oder? ^^ aja, den server solltest du hin und wieder mal neu starten, denn die zombie-kinder gehen nicht weg. die verbrauchen zwar keine resourcen mehr, aber müllen ps zu. wenn jemand weiß wie man die drecksteile entfernt bitte melden. + Multi-Zitat Zitieren
#20 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co Also für solche Server Angelegenheiten ist doch Python die perfekte Sprache. Nichts gegen PHP (und man sieht, dass es dafür auch geeignet ist), aber mit Python hast du das sicher schneller (solange du es kannst) und besser umgesetzt. Aber das spielt keine Rolle. Das "Problem" ist also noch der Client, der die Anfrage sendet und Empfängt. Aber das scheint ja auch ein ganz anderes Problem zu sein. Der neue IE(9) soll übrigens ziemlich rocken. Hab ihn schon mal Probegefahren und hab erzählt bekommen, dass er so viel toller mit HTML5 umgehen soll als alle anderen wegen der DirectX integration. Und das soll sogar stimmen Meinst du eigentlich, dass der Aufwand verhältnismäßig ist (zur jetzigen Zeit) für so eine kleine Funktionsweise (neue Kommentare). Das ist erst sinnvoll, wenn die neuen Browser Standard sind. Meine Meinung. PS: Murdoc ich finde den Namen "Client" für die Server Klasse ziemlich verwirrend PPS: Das ist eine unglaublich geile Technik. Mein Hirn raucht nach Einsatzmöglichkeiten und neuen Projekten, die darauf basieren. Bei dir auch Murdoc? + Multi-Zitat Zitieren
#21 6. Dezember 2010 AW: Cometd / node.js & socket.io und Co ja "Worker" hätte besser gepasst, aber nunja in der klasse werden alle sachen abgerabeitet vom vom client kommen oder zum client wandern - von daher ^^ bezüglich einsatzmöglichkeiten, ja da gibts es einige, aber im grunde konnte man sowas bisher auch mit ajax erledigen. mit dieser "technologie" geht halt einiges an overhead weg, weil der http-request wefällt. + Multi-Zitat Zitieren
#22 7. Dezember 2010 AW: Cometd / node.js & socket.io und Co Richtig! Möglichkeiten sind viele da ... Ich hatte vor einigen Jahren mal an ein etwas interaktiveres Quiz Spiel gedacht, Problem war immer nur der Umgang mit Verbindungsbrüchen usw ... Bei diesem Quiz dachte ich an so Sachen wie "Der schwächste fliegt" oder sowas in der Art, meine Idee war x User in eine "Arena" zu schmeißen und die in einem Quiz gegeneinander antreten zu lassen ... Ich denke mit den Websockets lässt sich sowas ganz schön umsetzen! + Multi-Zitat Zitieren
#23 7. Dezember 2010 AW: Cometd / node.js & socket.io und Co Moment einmal, mir fällt gerade ein das das alles irgendwie ziemlicher Schmarren ist! ;( Nehmen wir mal an ich arbeite mit einer normalen MySql Datenbank, nein Quark selbst wenn ich mit dem Filesystem arbeiten würde wäre es ... So, mein Ziel ist es dem User live über bestimmte Dinge zu informieren nicht alle x Sekunden, dann könnte ich es theoretisch ja auch per Ajax machen ... Mein Problem, im Endeffekt ist es doch Wurst ob ich unnötig Anfragen an den Server verbalere oder Datenbank Abfragen ... Theoretisch müsste ich ja in der Endlosschleife ständig in der Datenbank schauen (gehen wir mal von meinem Wunsch Feature aus) ob ein Bild kommentiert wurde oder nicht ... Das gäbe aber Massenhaft Abfragen ... Ich bin verwirrt, ich kann mir nicht vorstellen das facebook und Co das so machen ... Meine unausgereifte Idee wäre das irgendwie über die Session zu regeln, oder anders ... Hugo ist Freund von Bernd. Hugo kommentiert einen Upload (Bild) von Bernd. Das Skript informiert den Socket Server über diese Aktion und befiehlt diesem Bernd diese Information mitzuteilen ... Irgendwie so? :shock: Mein ich aber auch ... + Multi-Zitat Zitieren
#24 7. Dezember 2010 AW: Cometd / node.js & socket.io und Co Ich beantworte rückwärts: ^^ 1. Facebook ist viel in C programmiert http://developers.facebook.com/blog/post/358 2. Die Murdoc hat das Sleep(1) drin, weil sonst wirklich ständig das Script läuft. Das wäre ziemlicher Overload und Sekündliche Info reicht ja. Was du hier verwechselst sind die Requests. Du hast recht, dass der User mit "normalen" Ajax-Requests genauso informiert wird. Aber es ist eine Datenverbindung mehr So denkst du aktuell: Code: Kommentar erstellt Person A -> AJAX Request an Server -> Server speichert in DB Server informiert per Socket Person B ständig obs neues gibt und schaut in der DB -> sieht den Kommentar und informiert So sollte es aber sein: Code: Komment von Person A -> AJAX Req. an Server -> Server pusht an B UND Server speichert in DB -> Person B erhält Push per Websocket So hast du keine ständigen Datenbankabfragen in der Server-Schleife. 3. Vergiss nicht, dass es keinen Sinn macht, wenn jeder Client seinen eigenen ServerDaemon hat. Vielleicht liegt da der Denkfehler? Male die Request auf ein Blatt Papier, vielleicht ist das ja dann deutlicher Ja gut, man kann jegliche Art von Chat umsetzen. Aber der unterschied zwischen und Programmierern und dem User ist, dass dem User unsere neue tolle Technik scheiß egal ist! Warum sollte er also vom Knuddels-Flash-Chat-Script zum neuen Ajax-Websocket-Script wechseln? Flash hat ja leider eh noch jeder drauf. + Multi-Zitat Zitieren
#25 7. Dezember 2010 AW: Cometd / node.js & socket.io und Co Keine Ahnung! Aber so darf man bei neuen Sachen nicht denken ... Aber noch nicht so lange! (Und im Endeffekt ist es glaube auch PHP Code) Edit sagt: How to kill a zombie process | php commit Zombie Process, any way to kill? [Archive] - The macosxhints Forums + Multi-Zitat Zitieren