PY3; socketserver:Erneutes Verbindun zum Server schlägt fehl

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Purefranky
User
Beiträge: 8
Registriert: Montag 21. April 2008, 20:44

Hallo zusammen,

war vor Ewigkeiten schonmal hier, mein Raspberry Pi hat mich nun dieser Sprache wieder in die Hände gespielt und mir bereits ein gesundes Maß an Verwirrung bereitet.

Mein Problem: Ich habe eine Android-App (selfmade), die über einen Port befehle an meinen Pi schicken soll, wo diese dann umgesetzt werden. Mein Problem: Disconnecte ich einmal von diesem Server, komm ich nicht mehr "drauf", bzw. der Server reagiert nicht mehr.

Code: Alles auswählen

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """
    
    def handle(self):
        # self.request is the TCP socket connected to the client
        while True:
            self.data = self.request.recv(1024).strip()
            if (self.data!=b""):
                print (self.data)
                FuncTree=bytes.decode(self.data).split('.')
                print(FuncTree[0])
                 # just send back the same data, but upper-cased
                #self.request.sendall(self.data.upper())
        print("That's it")       
                
                
    def finish(self):
        print("I'm done")
        
        
#Now the main Program
if __name__ == "__main__":
    HOST, PORT = "", 4711

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    while True:
        server.handle_request()
        print("Working")
    print ("finished")
Ich bekomme weder "Working", noch "finished", noch "I'm done" "thats it" as well as I don't get ANY code on reconnect.
Wenn ich den eingehenden Text nicht auf Inhalt prüfe, bekomme ich nach disconnect zichtausendfach einen leerstring und Eric ist für 2 Minuten unerreichbar.
Kann mir mal jemand erklären, wo ich nach dem Disconnecten im Quelltext stehe und wie ich wieder zurück in die Handle-Funktion komme, wenn ich mich wieder verbinde?
Wie findet man solche Probleme in Python.

Eine Info zum Schluss:

Ich bin noch nicht aufm Pi unterwegs, sondern entwickle noch in meiner Suse12.1-Umgebung. Mein Vergleichsserver (in 20 Minuten in PureBasic inkl. Gui runtergetippert) funktioniert einwandfrei. Es liegt also definitiv am PythonServer!


Gruß

PureFranky
Zuletzt geändert von Anonymous am Sonntag 30. Dezember 2012, 19:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Kannst Du mir erklären, wie die handle-Funktion die while-Schleife verlassen kann?
Sobald der Socket geschlossen wird, liefert recv nur noch Leerstrings und hängt damit
für immer im while fest.
Purefranky
User
Beiträge: 8
Registriert: Montag 21. April 2008, 20:44

Ist ein guter Punkt.
Mir wurde es so erklärt, dass die Funktion automatisch verlassen wird bei Disconnect.

Wenn dem nicht so ist, wie fange ich einen Disconnect ab?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Purefranky hat geschrieben:Wenn dem nicht so ist, wie fange ich einen Disconnect ab?
Indem Du prüfst ob recv einen Leerstring zurückliefert.
BlackJack

@Purefranky: Das ist alles andere als robust. Wenn Du die Daten einfach nur in Grossbuchstaben zurück sendest, mag das noch gehen, aber das `FuncTree` lässt vermuten, dass Du da mehr machen möchtest. Und das geht so nicht. Bei dem `recv()` kann mehr oder weniger als das kommen, was beim Sender in einem `send()`-Aufruf verschickt wurde. Du musst beim Empfangen a) sicherstellen, dass alles empfangen wurde was zu einer Nachricht gehört und b) falls mehr empfangen wurde, sicherstellen, dass das nicht verworfen wird.

Die Klammern beim ``if`` sind überflüssig.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Oder einfach ein "höheres" Protokoll als Sockets verwenden, etwa XML-RPC oder ØMQ (ZeroMQ), welches sowas wie "Nachrichten" bereits unterstützt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten