Senden von Strings (Socket)

  • Hallo,

    ich hab eine Socket Verbindung mit zwei PIs aufgebaut.
    Ist es bei dieser Verbindung möglich Nachrichten zu verschicken und zu empfangen.

    Client Sendet Hallo --> Server printet Hallo aus
    Server Sendet Hallo --> Client printet Hallo aus

    Wie würde eine solche implementierung aussehen? Besnoders elegand wäre es, wenn man gleich die Tasten einfangen könnte und mit Enter senden könnte :)
    Bis jetzt merkt der Server, dass eine Verbindung aufgebaut wurde und sendet dann etwas an den Client. Aber vom Client kann ich irgendwie nichts
    an den Server schicken...

    Ich würde mich sehr freuen, wenn mir jemand helfen könnte

    s.recv(BUFFER_SIZE) scheint eine Möglichkeit zu sein. Das mit der Tastatureingabe klappt leider noch nicht so ganz. Eigentlich soll das Skript starten und auf eine Eingabe warten...

    Einmal editiert, zuletzt von PythonRapiPi (12. Dezember 2016 um 18:13)

  • Eigentlich ist es doch schnell lösbar.

    Das ist jetzt meine Client Lösung:


    Code
    while True:
    host = "192.168.1.2"
    port = 12345
    s = socket.socket()
    s.connect(host, port)
    msg = raw_input("Text zum Senden: ")
    s.send(msg)
    s.close()

    Ich habe fälschlicher weise zunächst angenommen, dass man msg nochmal casten müsste...

    Einmal editiert, zuletzt von PythonRapiPi (12. Dezember 2016 um 18:39)

  • Natürlich kann man sockets in beide Richtungen benutzen. Nur muss man sich dann mit ereignisbasierter Programmierung auseinandersetzen. Denn nur so kannst du gleichzeitig auf Eingaben vom Benutzer oder eben dem Socket warten. Und auch noch von Timern.

    Eine Möglichkeit ist das Modul asyncio: https://docs.python.org/3/library/asyncio.html

    Eine andere die libevent, und ihr (etwas in die Jahre gekommenes) python-binding: https://github.com/fancycode/python-libevent

    Oder man benutzt den vermeintlich einfachen Weg- threads! Das schöne daran ist, dass es einfach aussieht. Das böse daran ist, dass es das nicht ist, und man sich mit Karacho in den Fuss schiesst.
    Automatisch zusammengefügt:
    Nachtrag: dein Ansatz funktioniert -aber natürlich nur fuer eine vordefinierte Ereignisreihenfolge. Erst empfangen, dann auf Eingabe warten, dann senden. Das hilft aber nicht fuer dein eigentliches Szenario, bei dem du ja zwischen drei PIs beliebige Daten verschicken willst.

  • Erm. Eigentlich sage ich das genau nicht. Du solltest mit asynchroner Programmierung arbeiten. Weil Threads komplizierter sind, als sie aussehen.

Jetzt mitmachen!

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