[Ajax] Cometd / node.js & socket.io und Co

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Tiffany Dicks, 28. November 2010 .

Schlagworte:
  1. 7. Dezember 2010
    AW: Cometd / node.js & socket.io und Co


    Wie willst du das ganze Pushen? Also iwie muss die Information doch gespeichert werden damit das ganze von dem Socket abgefragt und ausgegeben werden kann.
     
  2. 7. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Mir schwirrt im Kopf irgendwie sowas herum wie gar keine Speicherung von Daten (außer in der Session wenn überhaupt) bis auf den Part mit dem Kommentar speichern ...

    Irgendwie muss es ja möglich sein die Clients OTF zu informieren ...
     
  3. 7. Dezember 2010
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: Cometd / node.js & socket.io und Co

    hab meinen server nochmal ein wenig überarbeitet:
    No File | www.xup.in

    starten über die bat/shell

    folgende komandos gibt es:
    Code:
    load -> läd ein modul aus dem ordner "ext"
    unload -> löscht das modul aus dem speicher
    close -> schließt die verbindung
    wenn man ein modul via "load" eingebunden hat kann man methoden davon aufrufen:
    Code:
    load chat
    auth [ { "username": "hans", "password": "geheim" } ]
    query [ { "to": "benutzer", "message": "asdf" } ]
    wie man sehen kann werden parameter als JSON übergeben

    der code würde praktisch so umgesetzt auf dem server:
    PHP:
    $modul  = new  Chat ();
    $modul -> auth (array( "username"  =>  "hans" "password"  =>  "geheim" ));
    $modul -> query (array( "to"  =>  "benutzer" "message"  =>  "asdf" ));
    zudem wird alle 60sek beim aktuell geladenen modul die methode "update" aufgerufen (falls vorhanden).

    im ordner "ext" sind zwei beispiel-klassen drinnen.

    ohne update:
    Code:
    load hello
    say_hello
    mit update:
    Code:
    load helloWorld
    say_hello
    beispiel aus der shell:
    Code:
    1:connected
    load test
    4:module "Test" file not found
    load hello
    2:module loaded
    say_hello
    hello
    load helloWorld
    3:module removed
    2:module loaded
    8:update@1291740233
    HelloWorld: no new updates
    say_hello
    HelloWorld: hello world
    8:update@1291740293
    HelloWorld: no new updates
    das ist nun erstmal die basis. um das ganze weiter ausbauen zu können braucht man noch ne schnittstelle um sockets bestimmten benutzer zuordnen zu können. dann kann man auf serverseite die sockets auch benennen und ne simple funktion in dein script integrieren mit der du bei neuen kommentaren direkt an die sockets updates senden kannst.

    mal sehen wie ich die kommunikation zwischen applikation und server baue.
     
  4. 7. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    vielleicht könnte man diese pipes so machen:
    PHP:
    <? php
    namespace  webs ;

    if(!
    class_exists ( '\webs\Base' ))
        require 
    'Base.class.php' ;

    class 
    Pipe  extends  Base
    {
        
    // name of the pipe
        
    protected  $file  '' ;
        
        
    // the read-offset
        
    protected  $offset  0 ;
        
        

        
    public function  __construct ( Worker $w )
        {
            
    $address  '' ;
            
    socket_getpeername ( $w -> getSocket (),  $address );
            
            
    $this -> file  sprintf ( '%s/%s.pipe' realpath ( __DIR__  '/../pipes' ),  md5 ( $this -> file ));
            
            if(!
    file_exists ( $this -> file ))
                
    file_put_contents ( $this -> file '' );
        }
        
        

        
    public function  readln (& $buff  '' )
        {
            
    $buff  '' ;
            
            
    $fp  fopen ( $this -> file 'r+' );
            
    flock ( $fp LOCK_EX  LOCK_NB );
            
    fseek ( $fp $this -> offset );
            
            
    $buff  fgets ( $fp );
            
    $this -> offset  +=  strlen ( $buff );
            
            
    flock ( $fp LOCK_UN );
            
    fclose ( $fp );
            
            return 
    trim ( $buff );
        }
        
        

        
    public function  writeln ( $buff )
        {
            
    file_put_contents ( $this -> file " $buff \n" FILE_APPEND );
        }
    }
    also einfach eine datei mit md5(ip-des-benutzers) anlegen und reinschreiben/lesen. dann musst du nur noch diese pipe mit dem entsprechenden benutzer verknüpfen, aber das sollte relativ leicht gehen, denn dazu musst du ja nur den md5-hash der ip in deiner db speichern und dann im Worker/Modul diese info einmalig auslesen.
     
  5. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    keiner ne idee dazu? oder driftet das zu sehr ab?

    hätte mal ne frage dazu: ist es irgendwie möglich von nem anderen prozess aus direkt auf den socket zum client zuzugreifen? socket_getsockname() irgendwie in ne datei speichern, dann auslesen und mit nem neuen socket verbinden und reinschreiben?
     
  6. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Ich leider nein. Hinke euch schon seit Posting 19 hinterher, ab da hab ich ncihts mehr so wirklich verstanden ^^ Ich muss ein eigenen Server haben um das zu testen oder? Die start.bat verwirrt mich nämlich ^^
     
  7. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    einfach den pfad anpassen wo bei dir php liegt.
    Code:
    set php="pfad/zum/php-interpreter/php.exe"
    wenn die läuft machst du ne neue konsole auf und tippst ein:
    Code:
    telnet localhost 9844
    um dich zum php-server zu verbinden.
     
  8. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Du bist ein Schatz!

    Ich muss mir das ganze in Ruhe anschauen, mache den Kram mit PHP zwar seit 6 Jahren aber so pro bin ich nun auch nicht!

    Nein, ich denke dieser Thread könnte manchen Menschen noch ziemlich hilfreich sein!
    Das Thema ist ja sehr interessant!
     
  9. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    wenn ich das noch mit den pipes und den zombies geregelt bekomm, können wir das ganze ja mal in ner html5 umgebung testen.
     
  10. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Year freue mich drauf! :]

    Wäre das nicht ein Workfix Einfach Server neu starten ^^
     
  11. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Also ich hatte ja einige Zeit an meinem Wissen für Python gearbeitet.
    Hier findet sich eine Funktionsweise, welche genau das Problem der "pipe" löst: Twisted FAQ

    Ich bin grad dabei rauszusuchen, wie das ganze funktioniert. Wenn ich mehr weiß, sag ich bescheid
     
  12. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    ich denke ich werde für das pipe-problem 2 methoden anbieten.

    1. files
    2. sqlite/mysql

    bei beiden verfahren werden die "nachrichten" dann anhand der ip des benutzers zugeordnet.

    dazu bau ich einfach eine modul-basis klasse die die ganze arbeit übernimmt:
    PHP:
    abstract class  ModuleBase
    {
        protected function 
    readFromPipe ()  { }
        
        protected function 
    writeToPipe () { }
    }
    welches verfahren dann zum einsatz kommt kann man in ner ausgelagerten config.php angeben.
    einfacher gehts wohl nicht, denn es ist ja wichtig, dass die schnittstelle leicht zu verstehen ist, und das sind sockets mmn. nicht
     
  13. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Also Twisted macht es so:

    Es wird eine instance für jeden Client gebildet (logischerweise). Die Instanzen speichert er in einer "list" (bei php registry-mäßig).

    und dann ruft er quasi nur die instanz auf:

    PHP:
    class  Zuteile  {
       private 
    $registry  = array();

       public function 
    connectMade () {
          
    $registry [ 'clients' ][ $this -> getClientIP ()] = new  Server
       
    }

       public function 
    getClientMessage ( $line ) {
          foreach(
    $registry [ 'clients' ] as  $client ) {
             if (
    $line  ==  'I want to quit' ) {
                
    $client -> writeToClient ( 'Bye Bye' );
             }
             
    $client -> closeConnection ();
          }

          if (
    $line  ==  '127.0.0.1 => HALLO Localhost' ) {
             
    $this -> registry [ 'clients' ][ '127.0.0.1' ]-> writeToClient ( 'PUSH DIESE Nachricht weiter' );
          }
       }
    }

    class 
    Server  {
       private 
    $instance ;

       public function 
    writeToClient ( $line ) {}
    }
    So oder so ähnlich.
    Oder steht sowas gar nicht zur diskussion?
     
  14. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    das problem dabei ist, dass man ja aus einer php-applikation in einem anderen prozess darauf zugreifen muss.

    der server läuft ja komplett eigenständig ohne apache usw. der eigentliche PUSH kommt ja von seiner webseite.
     
  15. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co


    Könnte aber auch wieder zu Problemen führen, wenn man eine Anwendung wie bei Facebook machen will die einen über Fotokommentare ect benachrichtigt.

    Da in einem Netzwerk ja mehrere Leute einen FB-Account haben können. Für so eine Anwendung wäre eine Kombi aus Benutzername,Benutzerid oder sonst etwas, was eindeutig einen User identifiziert + IP sicherer oder?
     
  16. 8. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    ja stimmt. da mach ich dann nen suffix dazu. am besten wär wohl der session-token.
     
  17. 16. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    hab den server nun in firefox4 ein wenig getestet und er läuft soweit auch. das problem mit den zombies hab ich auch in den griff bekommen, der fehler: ich hatte zwar nen signal-handler im hauptprogramm, aber keinen beim erstellen der worker und deswegen warteten die beendeten worker vergebens auf ihre erlösung ^^

    als pipe zwischen applikation und server/worker hab ich drei varianten erstellt:
    - gemeinsame nutzung einer zweier dateien (in/out) im FIFO prinzip
    - sqlite als message-queue
    - mysql als message-queue

    welche der methoden verwendet werden soll kann man in einem conf-file angeben. bei änderungen muss aber der komplette server neu gestartet werden, weil die angaben im ram gespeichert bleiben solange der server läuft.

    wie genau die kommunikation zwischen applikation und server von statten geht werd ich später noch mit beispielen und quelltexten dokumentieren. ist aber kinderleicht.

    zudem kann man in dem conf-file auch ein modul direkt beim erstellen des workers laden lassen. also der "load"-befehlt fällt dann weg.

    die syntax hat sich auch ein wenig geändert, um zwischen funktionsaufrufen und serverfunktionen unterscheiden zu können.

    serverbefehle beginnen immer mit einem @, serverantworten beginnen mit einem ! gefolgt vom status-code und dahinter nach einem : folgt eine kleine beschreibung

    Code:
    @auth session-id
    !123:session erfolgreich geladen
    !456:pipe "File" erfolgreich initialisiert
    @load modul
    !789:modul erfolgreich geladen
    funktion attribut
    [...]
    wichtig beim auth-befehl: es ist vollkommen egal was für ein token übergeben wird, solange die applikation dann hand von ip+token die entsprechende session zuordnen kann. d.h. es muss nicht zwingend die echte session-id sein.

    den attribut-parser hab ich auch noch ein wenig verbessert. mehrere argumente werden wie sonst auch als json-array interpretiert, wird nur ein attribut übergeben kann man es einfach dahinter schreiben.

    Code:
    funktion attribut # "attribut" wird an die function übergeben
    funktion ein längerer satz 1234 # "ein längerer satz 1234" wird als einzelnes attribut übergeben
    funktion ["foo", "bar", "baz"] # es werden drei attriute "foo", "bar" und "baz" an die funktion übergeben
    übersetzt:
    PHP:
    $modul -> funktion ( "attribut" );
    $modul -> funktion ( "ein längerer satz 1234" );
    $modul -> funktion ( "foo" "bar" "baz" );
    sourcecode gibts, sobald ich der meinung bis, dass das ganze stabil läuft. werde das dann in einem eigenen thread vorstellen, mit ner dokumentation ohne gramatik/rechtschreibfehler ^^
     
  18. 16. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Was wären wir nur ohne dich! ?(
     
  19. 21. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Schatz?

    Ich traue mich gar nicht wirklich zu fragen, wollte das mal testen über die Webgeschichte also über Chrome, leider klappt das nicht so ...

    Code:
    <!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>WebSocket Chat</title>
    </head>
    <body>
    <h1>WebSocket Chat</h1>
    <section id="content"></section>
    <input id="message" type="text"/>
    <script src="http://www.google.com/jsapi"></script>
    <script>google.load("jquery", "1.3")</script>
    <script src="http://jquery-json.googlecode.com/files/jquery.json-2.2.min.js"></script>
    <script src="http://jquery-websocket.googlecode.com/files/jquery.websocket-0.0.1.js"></script>
    <script>
    var ws = $.websocket("ws://localhost:9844/", {
     events: {
     message: function(e) { $('#content').append(e.data + '<br>') }
     }
    });
    $('#message').change(function(){
     ws.send('message', this.value);
     this.value = '';
    });
    </script>
    </body>
    </html>
    LG
     
  20. 21. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    wenn du meinen code verwendest: da fehlt noch der komplette handshake usw. d.h.: der funktioniert nicht
     
  21. 21. Dezember 2010
    AW: Cometd / node.js & socket.io und Co

    Hast du eventuell ein funktionierendes Beispiel?
     
  22. 21. Dezember 2010
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Cometd / node.js & socket.io und Co

    .. sollte also nicht mehr so lange dauern
     
  23. 4. Januar 2011
    AW: Cometd / node.js & socket.io und Co

    Ich hoffe ja das unser lieber Freund und Stecher bald mal wieder Zeit für diese coole Geschichte hat!
    Auf Murdoc's Code kann man gut ****orn!
     
  24. 21. Januar 2011
    AW: Cometd / node.js & socket.io und Co

    ja hab viel zu tun und nicht die nötigen ressourcen zur verfügung nebenher dieses doch recht große projekt alleine fortzuführen.

    du wirst dich also gedulden oder eine andere alternative suchen müssen.
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.