mod_pywebsocket als Apache Modul

Hookah

Erfahrenes Mitglied
Hey Leute

Habe vor zwei Tagen folgendes gelesen:
http://www.heise.de/ix/meldung/Erste-Implementierungen-von-WebSockets-881857.html

Das wollt ich dann natürlich gleich mal ausprobieren also hab ich mich an die Arbeit gemacht.

Zu erst habe ich mir Xampp 1.7.2 runtergeladen. Enthalten ist Apache 2.2.12 .
Danach habe Python 2.5.4 runtergeladen und installiert und anschließend
mod_python-3.3.1.win32-py2.5-Apache2.2.exe runtergeladen, installiert und getestet.

Beim Aufruf einer Testdatei namens mptest.py mit dem Inhalt
Code:
from mod_python import apache
def handler(req):
 req.content_type = 'text/plain'
 req.write("Hello World!")
 return apache.OK

Gibt mir beim Aufruf im Browser " Hello World! " aus sollte also funktionieren.

Fehlt nun noch pywebsocket ( http://code.google.com/p/pywebsocket/downloads/list )

Auf der Seite http://code.google.com/p/pywebsocket/ steht unten das ich mir , wenn ich es als Apache Modul haben möchte , die Anweisung von der Seite http://code.google.com/p/pywebsocket/source/browse/trunk/src/mod_pywebsocket/__init__.py beachten muss.

Soweit ich das verstehen sagt mir die obige Anweisung das ich nur etwas ändern muss in der Datei httpd.conf vom Apache wenn ich pywebsocket nicht im Python Verzeichnis habe ( Standard Installation auf C: )

Hab als das pywebsocket Archiv geladen ( neueste) und es in den C:\Python25 Ordner entpackt - mal mit dem Überorder namens mod_pywebsocket-0.4.3 und mal nur die Inhalte aus diesem Ordner.

Doch laufen tut es leider nicht.
Natürlich habe ich auch die neueste Google Chrome Version geladen ( DL : http://www.google.com/chrome/eula.html?extra=devchannel )

und damit dann eine Seite test.html aufzurufen in dem ein Script vermerkt ist zum testen :

HTML:
<script>
if ("WebSocket" in window) {

  var ws = new WebSocket("ws://localhost/websocket/test.php");
  

alert(ws.readyState);

	ws.onopen = function() {
    // Web Socket is connected. You can send data by send() method.
 	alert("hi");
   ws.send('1'); 
  };
alert(ws.readyState);

  ws.onmessage = function (evt) { var received_msg = evt.data; alert(received_msg); };
  ws.onclose = function() { alert("websocket is closed."); };


} else {
 alert("the browser doesn't support WebSocket.");
}
</script>

Ruft man die Seite zB im FF auf bekommt man die Meldung das der Browser keine Websockets unterstützt und auch so sagt das eine ältere Chrome Version also
hab ich wohl die richtige genommen.

alert(ws.readyState); gibt eine Zahl aus wobei

0 für "nicht verbunden",
1 für "verbunden",
2 für "verbindung getrennt"

steht. Erste alert(ws.readyState); gibt Null aus und das zweite schon 2.

alert in
HTML:
	ws.onopen = function() {
    // Web Socket is connected. You can send data by send() method.
 	alert("hi");
   ws.send('1'); 
  };

wird nie aufgerufen. Also bin ich mir doch ziehmlich sicher das ich es nicht richtig als Apache Modul eingerichtet habe.


Wie setz ich denn richtig den Pfad zum mod_pywebsocket ?

In der Anweisung steht :
Example snippet of httpd.conf:
(mod_pywebsocket is in /websock_lib, Web Socket handlers are in
/websock_handlers, port is 80 for ws, 443 for wss.)

<IfModule python_module>
PythonPath "sys.path+['/websock_lib']"
PythonOption mod_pywebsocket.handler_root /websock_handlers
PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
</IfModule>

Also ich denk <ifModule> checkt ob python_module installiert ist.

PythonPath , ändert das den Pfad oder gibt das folgende sys.path den Pfad zum Pythonordner an?
Falls nein , was ist sys.path?


Ich hoffe hier kann mir einer helfen ich weiss nicht mehr weiter.

Schönen Nachmittag :)
 
Hey Hookah,

ich sitze im Moment genau an dem selben Zeug. Vielleicht kann ich dir mit den Pfaden helfen:
Hast du websock_lib tatsächlich im root? Also c:\websock_lib? Und müsstest du unter Windows nicht eh "\"statt "/" verwenden? Unter Linux habe ich das Setup ausgeführt, das auf der Page von pywebsocket angegeben wird (http://code.google.com/p/pywebsocket/source/browse/trunk/src/README)

Danach lag der Ordner mod_pywebsocket in /usr/local/lib/python2.6/dist-packages/ und ich musste folgendes in die httpd.conf eintragen:
Code:
<IfModule python_module>
PythonPath "sys.path+['/usr/local/lib/python2.6/dist-packages/']"
PythonOption mod_pywebsocket.handler_root /var/www/websock_handlers
PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
</IfModule>

In dem Ordner für die WebSocket Handler hab ich mal die Testdatei echo_wsh.py gelegt und dann versucht darauf zuzugreifen mit:
Code:
var ws = new WebSocket("ws://localhost/echo");

Die Testdatei echo_client.py liefert die Ausgabe:
Code:
Send: Hello
Recv: Hello
Send: 日本
Recv: 日本
Send: Goodbye
Recv: Goodbye

Ansonsten hab ich den Javascript-Code wie du. Der Status wechselt aber immer von 0 auf 2. Ich frage mich ob die URL so stimmt. Angeblich wird ja der Zusatz "_wsh.py" automatisch ergänzt. Du versuchst da auf eine PHP Datei zuzugreifen. Was genau steht da denn drin?

So, keine wirklichen Erklärungen, nur weitere Fragen. Aber jetzt sind wir schonmal zu zweit ;)

VG,
Benjamin
 
Hey , freut mich das es jemanden gibt der mir mal antwortet :)
Hab schon echt verdammt viel gesucht und rumgefragt und nie kam etwas.

Das mit der PHP Datei ist schmarn , geht nicht - hab ich mittlerweile rausgefunden.

Habe jetzt in der httpd.conf Datei folgendes stehen:

Code:
<IfModule python_module>
    PythonPath "['C:/mod_pywebsocket']"
    PythonOption mod_pywebsocket.handler_root /localhost/websocket
    PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
</IfModule>

Ich muss / verwenden weil wegen unix da , \ funktioniert nicht hab ich gelesen.

Geb ich
Code:
    PythonOption mod_pywebsocket.handler_root /localhost/websocket

an dann krieg ich im error.log die Fehlermeldungen

Code:
[Mon Dec 14 16:44:16 2009] [warn] [client ::1] mod_pywebsocket: No handler for: '/websocket/echo'
[Mon Dec 14 16:44:16 2009] [error] [client ::1] File does not exist: C:/xampp/xampp/htdocs/websocket/echo
[Mon Dec 14 16:44:16 2009] [warn] [client ::1] mod_pywebsocket: No handler for: '/error/HTTP_NOT_FOUND.html.var'

Einmal kam auch
Code:
    [Mon Dec 14 11:47:33 2009] [warn] [client ::1] mod_pywebsocket: No handler for: '/websocket/echo_wsh.py'

also wurde dort _wsh.py angehangen , leider kann ich diesen Fehler nicht mehr reproduzieren.

Das ganze funktioniert einfach nicht und ich hab schon alle möglichen Kombinationen von Pfaden ausprobiert und überall diese mod_pywebsocktet Dateien und krieg es einfach nicht hin.

Wenn du so freundlich bist und mir helfen magst dann würd ich das
über einen Messenger bevorzugen. MSN oder ICQ? Kannst mir ja eine Private Nachricht schreiben ;)

Ansonsten kannst du mir natürlich auch gerne weiterhin hier antworten.
 
Hey,

also vielleicht sollten wir es öffentlich für andere lassen. Vielleicht kriegen wir am Ende ein kleines Tut zusammen.

In die Logs reinzuschauen is ne gute Idee :)
Bei mir scheiterte es an dieser Meldung:
Code:
[Mon Dec 14 17:56:18 2009] [warn] mod_pywebsocket: /var/www/websock_handlers/example/echo_wsh.py: Error in sourcing handler:Traceback (most recent call last):\n  File "/usr/local/lib/python2.6/dist-packages/mod_pywebsocket/dispatch.py", line 99, in _source\n    exec source_str in global_dic\n  File "<string>", line 31, in <module>\n  File "/usr/local/lib/python2.6/dist-packages/mod_pywebsocket/msgutil.py", line 40, in <module>\n    import Queue\nImportError: No module named Queue\n

Jetzt frage ich mich gerade wer von uns weiter ist...

Ansonsten habe ich auch mal einen der Entwickler angeschrieben, der weiß aber auch noch nicht wo das Problem liegt...
 
Ich hab nun wohl nur noch ein Problem und zwar hab ich es jetzt mal mit der standalone Version probiert (standalone.py)

cmd-> nach

Code:
C:\xampp\xampp\htdocs\websocket\build\lib\mod_pywebsocket
navigiert

und
Code:
standalone.py -p 80 -w  /example -d c:/xampp/xampp/htdocs/websocket

getippt und bestätigt ergibt

Code:
[2009-12-17 01:03:15,732] [CRITICAL] root: (10013, 'Permission denied')

und dazu find ich absolut nichts bei Google.

Die Pfade beim Aufruf sind sicher richtig und sonst gibt es auch keinen Fehler.

cmd als Administator gestartet hat nicht gereicht.
Dazu noch python.exe Administratorrechte gegeben hat auch nichts ergeben.
Hab dann noch die Besitzer der Dateien (cmd und python.exe) geändert damit ich wirklich alle Berechtigungen verteilen konnte was ich dann auch tat nur gebacht hat es nicht ...

So lang schon am probieren und es will und will nicht funktionieren.

Jemand eine Idee?
 
So hat sich erleidgt, ich habe es endlich geschafft es zum laufen zu kriegen.
Zwar nicht als Apache Modul aber es gibt eine standalone version bei pywebsocket.

Hier eine kurze Beschreibung für interessierte

1. In den Python Ordner wechseln und python.exe -> rechtsklick -> kompatibilität -> als Administrator ausführen häkchen setzten

2.cmd als Administrator öffnen und zur Datei setup.py navigieren

3 setup.py build eingeben und bestätigen. es ensteht ein build ordner , diesen dann wo man ihn haben möchte hinkopieren.

3.1 setup.py install eingeben und bestätigen. mod_pywebsocket wird installiert

4. Dann im cmd zu dem ordner build/lib/mod_pywebsocket navigieren. (da wo man ihn hinkopiert hat oder eben nicht)

5. eingeben und bestätigen : standalone.py -p 8080 -d c:/xampp/xampp/htdocs/websocket -w example


d -> pfad zu den html Dateien etc

w -> ordner in dem die websockethandler sind (echo_wsh.py und echo_client.py zum 5esten zum Beispiel)

Pfad ist relativ


Zum Testen eignet sich echo_wsh.py , diese und echo_client.py in den Ordner kopieren der bei -w angegeben wurde.

6. Beispiel HTML

Code:
<html>

<head>

<script>

if ("WebSocket" in window) {

  var ws = new WebSocket("ws://localhost:8080/echo");
  


	ws.onopen = function() {
    // Web Socket is connected. You can send data by send() method.
 	
   ws.send('Hello'); 
  };



  ws.onmessage = function (evt) { var received_msg = evt.data; alert("Hier nach erscheint die Antwort");alert(received_msg); };
  ws.onclose = function() {  
alert("websocket is closed."); };

} else {
 alert("the browser doesn't support WebSocket.");
}

</script>

</head>

<body>

<input type="button" value="Socket schließen" onclick="ws.send('Goodbye');">
</body>


</html>

beim button ws.send('Goodbye') veranlasst echo_wsh.py die Verbindung mit der Ausgabe von Goodbye zu schließen.
 
Zurück