Websockets
Tom
- webserver
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
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
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
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
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
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
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
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
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
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
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
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
Hello,
hi Tom,
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