Python Socket und JavaScript Socket

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    nachdem meine Socket-Verbindung vom Server zur Ampel über Python einwandfrei funktioniert, bin ich jetzt soweit die Steuerung zu basteln.

    Ich hab kurz ein wenig gegooglet und dabei soviel gelesen wie: JavaScript kann nur WebSockets und WebSockets können sich nicht mit "normalen" Sockets verbinden.

    Stimmt das so? Oder ist das ein alter Stand?

    Oder muss ich tatsächlich in meinem Pythonscript einen zweiten Socketserver öffnen (für Websockets), über den dann die Steuerung läuft? Kann ich das nicht in einem bündeln?

    Vielen Dank im voraus und

    liebe Grüße

    Fipsi

  • Soweit ich weiß sind nur HTTP-Requests und Websockets möglich und je nach Sicherheitsrichtlinie nur vom gleichen Host.

    Aber was wäre Python ohne Library für websockets.

    Kleines Beispiel mit asyncio und websockets.

    Zum Testen kann man websocket_client verwenden.

    Server (aus dem Beispiel):

    Test-Client:

    Falls neben Websockets auch HTTP verwendet werden soll, würde sich z.B. FastAPI anbieten oder Flask.

  • Nachdem meine Versuche mit ner TCP-/Web-Socket-Bridge fehlgeschlagen sind, versuch ich's jetzt wirklich mit WebSockets.

    Dazu hab ich auf meinem Raspberry Pi folgende Scripte laufen:

    Python: server.py
    import asyncio
    import websockets
    
    async def echo(websocket, path):
        async for message in websocket:
            await websocket.send(message)
    
    asyncio.get_event_loop().run_until_complete(
        websockets.serve(echo, 'localhost', 14401))
    asyncio.get_event_loop().run_forever()
    JavaScript: client.js
    var socket = new WebSocket("ws://localhost:14401")

    Wenn ich dann im Browser das JS aufrufe, kommt in der Konsole folgende Meldung:

    Firefox kann keine Verbindung zu dem Server unter ws://localhost:14401/ aufbauen.

    Was mach ich denn in den wenigen Zeilen schon falsch? :conf::conf:

    Liebe Grüße

    Fipsi

    Edit:

    Ich hab mich gerade ein wenig in Flask eingelesen. Ist es vielleicht sinnvoller das zu verwenden? Das Problem dabei ist allerdings, dass auf dem Pi bereits ein Apache läuft mit Webseite, auf der eben das JS-Script laufen soll.

    Einmal editiert, zuletzt von Fipsi (2. August 2021 um 20:18)

  • Hallo,

    ich beschäftige mich auch ganz frisch mit Netzwerken und frage mal ganz vorsichtig ob der Port 14401 eventuell in deiner Firewall geöffnet sein muss?

    Mit nmap kannst du zum Beispiel nach offenen Ports scanen.

    Speziell für 14401 wäre das für das tcp-Protokoll:

    Code
    nmap -p14401-14401 localhost

    und für das udp-Protokoll:

    Code
    nmap -sU -p14401-14401 localhost

    Öffnen kannst du Ports mit iptables.

    Aber das ist jetzt nur eine Vermutung. Falls du den Port öffnest und das war nicht das Problem, schließe ihn gleich wieder.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Ich glaub nicht, dass das was mit ner Firewall zu tun hat, da ich im eigenen Netzwerk bin und nur auf einem Pi mit meinem Laptop.
    Über den Port 14400 kann ich von einem anderem Pi auf den hier betreffenen mit TCP-Sockets auch zugreifen, dann sollte ja der 14401 auch gehen?

    Der nmap-Scan sagt jetzt auch nichts blockierendes aus, soweit ich das sehe:

    Liebe Grüße

    FIpsi

  • Nö, aber wenn es auf einem Port geht und auf dem anderen nicht, bedeutet es doch, dass der andere Port schon belegt ist, oder nicht ? :denker:

    Ich wüsste nicht, von was der belegt sein sollte.

    Außerdem würde dann doch das Python-Script, das den WebSocket-Server startet, abstürzen mit nem Error? Das lief aber mit der Meldung, dass der Server erfolgreich gestartet werden konnte.

    Liebe Grüße

    Fipsi

  • Ich wüsste nicht, von was der belegt sein sollte.

    Die TCP sockets kannst Du mit:

    Code
    ss -t -a -n

    und die UDP sockets, mit:

    Code
    ss -u -a -n

    anzeigen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Also mit

    Code
    ss -t -a -n

    ist Port 14401 erst belegt, wenn ich das Python-Script starte, mit dem ich den WebSocket öffne:

    Code
    pi@arwstst:~ $ ss -t -a -n
    State           Recv-Q       Send-Q                                       Local Address:Port                                          Peer Address:Port        
    LISTEN          0            100                                              127.0.1.1:14401                                              0.0.0.0:*       

    Aber JavaScript kann sich laut Firefox trotzdem immer noch nicht verbinden, egal, ob ich als Adresse localhost, 127.0.01 oder den Hostname angebe.

    Hat noch jemand ne Idee, was ich verkack?

    Liebe Grüße

    Fipsi

    Edit:

    Gerade noch ein wenig gegooglet und dann mal vom Laptop aus geprüft, ob der Port am Pi offen ist:

    Code
    me@laptop:~$ nc -w5 -z -v 192.178.168.31 14401
    nc: connect to 192.178.168.31 port 14401 (tcp) timed out: Operation now in progress

    Einmal editiert, zuletzt von Fipsi (3. August 2021 um 10:48)

  • Aber JavaScript kann sich laut Firefox trotzdem immer noch nicht verbinden, egal, ob ich als Adresse localhost, 127.0.01 oder den Hostname angebe.

    Hat noch jemand ne Idee, was ich verkack?


    Blöde Frage, aber den Firefox welchen du aufrufst, der läuft auch auf dem PI ?
    Nicht das du versuchst vom Notebook aus mit dem Firefox auf "Localhost" zuzugreifen :)

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.


  • Blöde Frage, aber den Firefox welchen du aufrufst, der läuft auch auf dem PI ?
    Nicht das du versuchst vom Notebook aus mit dem Firefox auf "Localhost" zuzugreifen :)

    Nööö... vom Firefox von meinem Laptop aus. :bravo2:

    Aber wie gesagt, mit dem Hostname und der IP-Adresse sagt er das selbe...

    Liebe Grüße

    Fipsi

    Edit:

    *Trommelwirbel*

    Jetzt klappt's. Ich hab im Python-Script immer localhost angegeben.. wenn ich aber die IP-Adresse angebe oder das Feld leer lass, dann kann ich über die IP-Adresse oder dem Hostname im JavaScript verbinden.

    Jetzt dürft ihr mich mit Wattebällchen bewerfen, bis ich blute :shy:

  • OK; selber darauf gekommen. :bravo2::thumbup:
    Das wäre das nächste gewesen,dDen Server auf 0.0.0.0 statt localhost lauschen zu lassen :)

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • . Ich hab im Python-Script immer localhost angegeben.. wenn ich aber die IP-Adresse angebe oder das Feld leer lass, dann kann ich über die IP-Adresse ...

    Ja, denn mit localhost hast Du festgelegt, dass nur auf localhost gelauscht wird (siehe dein Beitrag #13, Ausgabe von "ss -t -a -n").

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Schau mal nach Flask, Django, FastAPI (Starlette).

    Flask: Microwebframework, recht einfach aufgebaut, kann aber bei großen Projekten schnell unübersichtlich werden

    Django: MFC orientiertes Webframework. Der Stil wird durch das Framework vorgegeben.

    FastAPI: Framework für REST-APIs mit automatisch generierter Dokumentation aus dem Code.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!