Tom: Websockets

Hello,

ich bastel schon ein paar Tage mit den unterschiedlichen Beispielen und Browsern und Websockets herum.

Unter https://github.com/Flynsarmy/PHPWebSocket-Chat habe ich gestern Abend eine ganz vielversprechende Klasse gefunden, die auch auf dem Xampp nach einigen Nachbesserungsarbeiten läuft.

Theoretisch müsste auspacken, starten, nutzen bei sonst fertig eingerichteten Systemen reichen :-)
Das Beispiel ist also total unkompliziert aufgebaut.

Bei meinen Gehversuchen habe ich dann auch versucht, vom Lappi aus über LAN oder WLAN auf den Testserver [Good old crate host] zuzugreifen und mit dem Websocket Verbindung aufzunehmen. Das scheitert leider noch.

Ich habe keinen lokalen DNS laufen, aber in den Hosts-Dateien der einzelnen Hosts die anderen gegenseitig bekannt gemacht, sofern dies notwendig ist. Leider bekomme ich vom Lappi aus beim Zugriff auf die Testseite immer nur ein

Connecting...
Disconnected

zu sehen.

Ich hatte nun angenommen, dass es an der letzten Zeile in der Datei server.php liegt

  
#$Server->wsStartServer('127.0.0.1', 9300);  
$Server->wsStartServer('192.168.178.50', 9300);  
  

und habe sie entsprechend der Netz-IP des Testservers angepasst. Leider ändert das nichts.
Das Lokale Netz arbeitet mit einer Fritz-Box. Aber auch direkt über den Switch und LAN klappt es nicht.

Wer hätte denn mal Lust und Zeit dazu, sich mit mir durchzukämpfen durch den Stoff?

Muss jetzt nochmal schnell einkaufen fahren, bin um 15:30 wieder hier und freu mich auf Antwort.
[Handelt sich ja schließlich um einen "Chat-Server". Da kann doch die Antwort spontan erwartet werden *grins*]

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
Die ultimative Seite für Selbermacher
  1. Hello,

    Ich hatte nun angenommen, dass es an der letzten Zeile in der Datei server.php liegt

    #$Server->wsStartServer('127.0.0.1', 9300);
    $Server->wsStartServer('192.168.178.50', 9300);

    
    >   
    > und habe sie entsprechend der Netz-IP des Testservers angepasst. Leider ändert das nichts.  
    > Das Lokale Netz arbeitet mit einer Fritz-Box. Aber auch direkt über den Switch und LAN klappt es nicht.  
      
    Nach der Änderung bekomme ich an der "Konsole" des Testservers leider nur noch die gleiche Antwort.  
      
      
    Connecting...  
    Disconnected.  
      
      
    Netstat -a zeigt allerdings an:  
      
    ~~~ascii
      
      ...  
      
      TCP    pc48:1201              imap.1und1.de:993      HERGESTELLT  
      TCP    pc48:1203              imap.1und1.de:993      HERGESTELLT  
      TCP    pc48:1205              we-in-f16.1e100.net:993  HERGESTELLT  
      TCP    pc48:2631              ber01s08-in-f14.1e100.net:https  HERGESTELLT  
      TCP    pc48:2635              bk-in-f100.1e100.net:https  HERGESTELLT  
      TCP    pc48:9300              pc48:0                 ABHÖREN  
      UDP    pc48:microsoft-ds      *:*  
      UDP    pc48:isakmp            *:*  
      
      ...  
      
    
    

    also scheint der Port doch etabliert zu sein.

    Bei der Gelegenheit frage ich gelich mal, was denn

      
      
      TCP    pc48:1205              we-in-f16.1e100.net:993  HERGESTELLT  
      TCP    pc48:2631              ber01s08-in-f14.1e100.net:https  HERGESTELLT  
      TCP    pc48:2635              bk-in-f100.1e100.net:https  HERGESTELLT  
      
      
    
    

    für Lauscher sind... ???

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    Die ultimative Seite für Selbermacher
    1. Hello,

      die "normalen" HTTP-Requests erscheinen so:

        
        
      127\.0.1.1 - - [21/Jun/2014:14:09:43 +0200] "GET /Websockets/ HTTP/1.1" 200 1765 "http://testserver.lan/" "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"  
      127\.0.1.1 - - [21/Jun/2014:14:09:45 +0200] "GET /Websockets/Class/ HTTP/1.1" 200 1349 "http://testserver.lan/Websockets/" "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"  
      192\.168.178.25 - - [21/Jun/2014:15:25:32 +0200] "GET / HTTP/1.1" 200 32327 "-" "Mozilla/5.0 (X11; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0"  
      192\.168.178.25 - - [21/Jun/2014:15:25:33 +0200] "GET /favicon.ico HTTP/1.1" 404 1192 "-" "Mozilla/5.0 (X11; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0"  
      192\.168.178.25 - - [21/Jun/2014:15:25:42 +0200] "GET /Websockets/ HTTP/1.1" 200 1765 "http://testserver.lan/" "Mozilla/5.0 (X11; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0"  
      192\.168.178.25 - - [21/Jun/2014:15:25:44 +0200] "GET /Websockets/Class/ HTTP/1.1" 200 1349 "http://testserver.lan/Websockets/" "Mozilla/5.0 (X11; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0"  
      127\.0.1.1 - - [21/Jun/2014:15:30:00 +0200] "GET / HTTP/1.1" 200 32327 "-" "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"  
      127\.0.1.1 - - [21/Jun/2014:15:30:09 +0200] "GET /Websockets/ HTTP/1.1" 200 1765 "http://testserver.lan/" "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"  
      127\.0.1.1 - - [21/Jun/2014:15:31:13 +0200] "GET /Websockets/Class/ HTTP/1.1" 200 1349 "http://testserver.lan/Websockets/" "Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0"  
        
      
      

      der lokale Zugriff wird also nicht mit 192.168.178.50 entgegen genommen, sondern mit 127.0.1.1

      Lag an der Hosts des Testserver
      Das habe ich jetzt gerade geändert

        
        
      #127.0.1.1       testserver.lan  
      192\.168.178.50   testserver.lan  
        
      
      

      Im HTTP-Access-Log erscheint die Anfrage jetzt mit der passenden IP. Das Resultat hat sich aber noch nicht geändert.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
      1. Hello,

        im PHP-Error-Log stehen nur folgende relevante Einträge:

        [Code lang=ascii]

        [21-Jun-2014 11:53:57 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Programme\xampp\php\ext\php_intl.dll' - Das angegebene Modul wurde nicht gefunden.
         in Unknown on line 0
        [21-Jun-2014 14:07:26 Europe/Berlin] PHP Warning:  socket_bind(): unable to bind address [10049]: Die angeforderte Adresse ist in diesem Kontext ungültig.
         in Q:\Websockets\Class\PHPWebSocket-Chat-master\class.PHPWebSocket.php on line 110

        [/code]

        Die Ursache des ersten habe ich beseitigt, den zweiten verstehe ich noch nicht...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        Die ultimative Seite für Selbermacher
        1. Hello,

          im PHP-Error-Log stehen nur folgende relevante Einträge:

          [Code lang=ascii]

          [21-Jun-2014 11:53:57 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Programme\xampp\php\ext\php_intl.dll' - Das angegebene Modul wurde nicht gefunden.
          in Unknown on line 0
          [21-Jun-2014 14:07:26 Europe/Berlin] PHP Warning:  socket_bind(): unable to bind address [10049]: Die angeforderte Adresse ist in diesem Kontext ungültig.
          in Q:\Websockets\Class\PHPWebSocket-Chat-master\class.PHPWebSocket.php on line 110

          [/code]

          Die Ursache des ersten habe ich beseitigt, den zweiten verstehe ich noch nicht...

            
            
          	// server state functions  
          	function wsStartServer($host, $port) {  
          		if (isset($this->wsRead[0])) return false;  
            
          		if (!$this->wsRead[0] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {  
          			return false;  
          		}  
          		if (!socket_set_option($this->wsRead[0], SOL_SOCKET, SO_REUSEADDR, 1)) {  
          			socket_close($this->wsRead[0]);  
          			return false;  
          		}  
          110:    if (!socket_bind($this->wsRead[0], $host, $port)) {  
          			socket_close($this->wsRead[0]);  
          			return false;  
          		}  
          		if (!socket_listen($this->wsRead[0], 10)) {  
          			socket_close($this->wsRead[0]);  
          			return false;  
          		}  
            
          
          

          Ich nehme also erstmal an, dass es mit $host und der Auflösung zu tun hat...

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          Die ultimative Seite für Selbermacher
          1. Hello,

            wenn man

              
              
             Mex ¶  
            2 years ago  
            It appears for the $address parameter:  
              
            '127.0.0.1'  
            accepts clients from localhost (eg. 127.0.0.1)  
              
            '0.0.0.0'  
            accepts clients from localhost, and the server's network (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40)  
              
            '0' or 0  
            accepts clients from localhost, the server's network, and external networks (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40, 209.85.169.99)  
              
            
            

            aus den PHP-UCNs berücksichtigt, kann man mit

            [code lang0php]
            #$Server->wsStartServer('127.0.0.1', 9300);
            #$Server->wsStartServer('192.168.178.50', 9300);
            #$Server->wsStartServer('0.0.0.0', 9300);
            $Server->wsStartServer('0', 9300);

            [/code]

            schon mal dafür sorgen, dass von der Localhost-Konsole wieder konnected werden kann.
            Andere Teilnehmer aus dem LAN / WLAN gehen aber leider noch leer aus.

            Der Fehler muss also zwischendrin (in der Klasse) liegen.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            Die ultimative Seite für Selbermacher
            1. Hello,

              Fehler gefunden.
              Steckte im HTML-Dokument.

                
              29:    $(document).ready(function() {  
                         log('Connecting...');  
              	   //Server = new FancyWebSocket('ws://127.0.0.1:9300');  
              	   Server = new FancyWebSocket('ws://192.168.178.50:9300');  
                
              
              

              Die IP muss also noch erstetzt werden durch die Domain.

              Anhand dieser Rumpf-Idee kann ich also nun starten...

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              Die ultimative Seite für Selbermacher
              1. hi Tom,

                Hello,

                Fehler gefunden.
                Steckte im HTML-Dokument.

                29:    $(document).ready(function() {
                           log('Connecting...');
                   //Server = new FancyWebSocket('ws://127.0.0.1:9300');
                   Server = new FancyWebSocket('ws://192.168.178.50:9300');

                
                >   
                >   
                > Die IP muss also noch erstetzt werden durch die Domain.  
                  
                Nun, das ist doch klar, sonst fragt der Client doch bei sich selbst an bzw. auf dem Rechner, auf dem er läuft ...;  
                  
                  
                mfg  
                  
                tami
                
                1. Hello,

                  Die IP muss also noch erstetzt werden durch die Domain.

                  Nun, das ist doch klar, sonst fragt der Client doch bei sich selbst an bzw. auf dem Rechner, auf dem er läuft ...;

                  Klar war mir das klar. Aber man muss den Code doch erstmal durchackern nach möglichen Fehlern. So von ganz alleine weiß man ja nicht, welcher Fehler es ist und wo der steckt. Also habe ich erstmal ein Logging in die Klasse eingebaut. Da aber nichts gelogged wurde, war mir klar, dass der Fehler beim Client stecken musste...

                    
                  29:	$(document).ready(function() {  
                              log('Connecting...');  
                              //Server = new FancyWebSocket('ws://127.0.0.1:9300');  
                              //Server = new FancyWebSocket('ws://192.168.178.50:9300');  
                              Server = new FancyWebSocket('ws://' + window.location.host + ':9300');  
                  	  
                    	    $('#message').keypress(function(e) {  
                                  if ( e.keyCode == 13 && this.value ) {  
                                      log( 'You: ' + this.value );  
                                      send( this.value );  
                    
                  ...  
                    
                  
                  

                  Das kann man auch anpassen...
                  Nächster Schritt wäre dann wohl, eine Subdomain für ws einzurichten, also

                    
                    
                  	Server = new FancyWebSocket('ws://' + 'ws.' + window.location.host + ':9300');  
                  
                  

                  und dann mittels mod_proxy_wstunnel den Apache aufzubohren. Damit könnte man dann vielleicht auch das Zuordnungsproblem lösen... Ich weiß noch nicht.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  Die ultimative Seite für Selbermacher
        2. hi,

          Die Ursache des ersten habe ich beseitigt, den zweiten verstehe ich noch nicht...

          Im Server zu konfigurieren wären der port fürs listening, das protokoll (tcp), reuse und socket_max_connections, die IP-Adresse interessiert den Server nicht.

          Socke, Horst

  2. Hello,

    also ich sauf mir jett erstmal einen an mit einem guten Rotwein.

    Und wenn ich dann seelig einschlafe, träume ich hoffentlich von einer guten Debug-Strategie.
    An welchen Stellen sollte ich denn wie angreifen?

    Letztlich läuft das das Ding immer noch über PHP, das sich im TCP-Stack des Betriebssystems einklinkt.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    Die ultimative Seite für Selbermacher
    1. Hello,

      also ich sauf mir jetzt erstmal einen an mit einem guten Rotwein.

      Und wenn ich dann seelig einschlafe, träume ich hoffentlich von einer guten Debug-Strategie.
      An welchen Stellen sollte ich denn wie angreifen?

      Letzte Meldung von der Testserver-Konsole vorm Mittagsschlaf:

        
      Q:\Websockets\Class\PHPWebSocket-Chat-master>c:\Programme\xampp\php\php server.php  
      2014-06-21 17:30:39: 127.0.0.1 (1) has connected.  
      2014-06-21 17:31:06: 127.0.0.1 (1) has disconnected.  
        
      
      

      der böse Bube hat sich also immer noch mit 127.0.0.1 angemeldet beom Websocket, obwohl ich das in der HOSTS-Datei aukommentiert hatte.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
    1. Hello,

      hi Tom,

      https://forum.selfhtml.org/?t=217734&m=1496557

      Ich habe dir "da unten" nochmal geantwortet.

      Mein Rumpfmodul von https://github.com/Flynsarmy/PHPWebSocket-Chat läuft jetzt jedenfalls.

      Jetzt geht es darum, einen echten kleinen Server daraus zu machen, der auch "VirtHosts" berücksichtigen kann und Benutzeranmeldung berücksichtigt, usw.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher