ralphi: Server soll über socket senden

Hi Leute,

wenn ich eine Socketverbindung zu meinem Webserver bei Strato aufbaue. Wie kann ich die Verbindung halten und vom Webserver, wenn sich neue Daten ergeben zum Client senden? Ist die Verbindungsdauer über ‘strato’-servertimeout definiert?

Also:

  1. client baut Verbindung auf
  2. Sever wartet auf Ereignis (bis 1min)
  3. Server sendet Daten zum Client

Hintergrund: Der Server kann keine Verbindung aufbauen, da der Client über UMTS-Stick mit dem Internet verbunden ist und keine eingehende Verbindungen akzeptiert. Der Client soll nach Usereingaben am Server, Daten ausdrucken und Bestätigung zum Server senden.

Eine Verbindung zum Server klappt eigentlich soweit, nur Daten bekomme ich ohne "Connection: Close\r\n\r\n"; gar keine und dann auch nur mit einem einfachen echo .statt socket_write !?

Client:

$service_port = 80; 
/* Die  IP-Adresse des Zielrechners ermitteln. */
$address = gethostbyname('blog.xxx.de'); //

// ****** USER UND PASS für htaccess
$credentials = base64_encode('user:pass'); 
/* Einen TCP/IP-Socket erzeugen. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...";
$result = socket_connect($socket, $address, $service_port);
$in = "GET /data.php HTTP/1.1\nAuthorization: Basic ".$credentials."\r\n";
$in .= "Host: blog.xxx.de\r\n";
//$in .= "Connection: Close\r\n\r\n";
echo "HTTP HEAD request senden ...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";
echo "Serverantwort lesen:\n\n";
while ($out = socket_read($socket, 2048)) { 
    echo $out."<br>\n";
    //sleep(1);
}
socket_close($socket);

Server:

if (($msgsock = socket_accept($sock)) === false) {
    echo "socket_accept() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "\n";
    break;
}
/* Anweisungen senden. */
$msg = "\nWillkommen auf dem PHP-Testserver.  \n" .
    "Um zu beenden, geben Sie 'quit' ein. Um den Server herunterzufahren, geben Sie 'shutdown' ein.\n";
socket_write($msgsock, $msg, strlen($msg));
--
Viele Grüße aus LA ralphi
  1. Moin!

    wenn ich eine Socketverbindung zu meinem Webserver bei Strato aufbaue.

    Rückfrage: virtueller eigener Server (Du hast ein eigenes OS ) oder Massenhosting?

    Rest neu formatiert:

    Wie kann ich die Verbindung halten und vom Webserver, wenn sich neue Daten ergeben zum Client senden? Ist die Verbindungsdauer über ‘strato’-servertimeout definiert?

    Also:

    1. client baut Verbindung auf
    2. Sever wartet auf Ereignis (bis 1min)
    3. Server sendet Daten zum Client

    Hintergrund: Der Server kann keine Verbindung aufbauen, da der Client über UMTS-Stick mit dem Internet verbunden ist und keine eingehende Verbindungen akzeptiert. Der Client soll nach Usereingaben am Server, Daten ausdrucken und Bestätigung zum Server senden.

    Eine Verbindung zum Server klappt eigentlich soweit, nur Daten bekomme ich ohne "Connection: Close\r\n\r\n"; gar keine und dann auch nur mit einem einfachen echo .statt socket_write !?

    Client:

    $service_port = 80; 
    /* Die  IP-Adresse des Zielrechners ermitteln. */
    $address = gethostbyname('blog.xxx.de'); //
    
    // ****** USER UND PASS für htaccess
    $credentials = base64_encode('user:pass'); 
    /* Einen TCP/IP-Socket erzeugen. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...";
    $result = socket_connect($socket, $address, $service_port);
    $in = "GET /data.php HTTP/1.1\nAuthorization: Basic ".$credentials."\r\n";
    $in .= "Host: blog.xxx.de\r\n";
    //$in .= "Connection: Close\r\n\r\n";
    echo "HTTP HEAD request senden ...";
    socket_write($socket, $in, strlen($in));
    echo "OK.\n";
    echo "Serverantwort lesen:\n\n";
    while ($out = socket_read($socket, 2048)) { 
        echo $out."<br>\n";
        //sleep(1);
    }
    socket_close($socket);
    

    Server:

    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Anweisungen senden. */
    $msg = "\nWillkommen auf dem PHP-Testserver.  \n" .
        "Um zu beenden, geben Sie 'quit' ein. Um den Server herunterzufahren, geben Sie 'shutdown' ein.\n";
    socket_write($msgsock, $msg, strlen($msg));
    

    Jörg Reinholz

    1. Hi Jörg,

      Rückfrage: virtueller eigener Server (Du hast ein eigenes OS ) oder Massenhosting?

      Massenhosting :-

      Rest neu formatiert:

      danke wie hast du den Code gepackt? Ich seh nur einen Button </>

      --
      Viele Grüße aus LA ralphi
      1. Hallo,

        wie hast du den Code gepackt? Ich seh nur einen Button </>

        Der Button ist schon richtig, aber siehe auch den Hinweistext oben auf der Seite: die Leerzeilen sind wichtig. Auch für die Auflistung.

        Gruß
        Kalk

      2. Hallo und guten Morgen,

        Rückfrage: virtueller eigener Server (Du hast ein eigenes OS ) oder Massenhosting?

        Massenhosting :-

        Ich habe hier eben "Kassenhosting" (= "Massenpatient") gelesen ;-P
        Würde ja auch passen...

        Vielleicht interessieren dich die Klasse und die Beispiele, die Google dafür bereit hält?

        	Based on PHP WebSocket Server 0.2
        	 - http://code.google.com/p/php-websocket-server/
        	 - http://code.google.com/p/php-websocket-server/wiki/Scripting
        
        	WebSocket Protocol 07
        	 - http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07
        	 - Supported by Firefox 6 (30/08/2011)
        
        

        Ich habe schon damit herumgespielt und es funktioniert auch mobil.

        Grüße
        TS