Seite 1 von 1

Wie XMLRPC-Server beenden?

Verfasst: Mittwoch 10. Juni 2009, 21:57
von py_lo
Moin zusammen,

Dieser Thread ist ja schon etwas älter, aber vom Thema passt es ganz gut
also wollte ich nicht neu posten.

Folgenden Code habe ich mir für meine Zwecke zusammengeklaut :wink:

Mein Problem:
Wie kann ich den Server vom Client aus beenden? oder wie kann ich
überhaupt ein Programmabbruch bewirken (außer mit ctrl-c)?

Habe es mit exit(0) oder raise keyboardinterrupt versucht allerdings
werden diese Ausnahmen dann beim Clientprogramm ausgelöst.

Code: Alles auswählen

#!/usr/bin/env python


import SimpleXMLRPCServer
from os import popen
from sys import exit

class KerioFunctions:
        def __init__(self):
                import string
                self.python_string = string

        def exe_xbmc(self, rs_cmd):
                """
                representing the actual interface
                """
                if rs_cmd == ("vol"): #test
                        xbmc.executebuiltin("xbmc.setvolume(70)")
                return "You sent: %s" %rs_cmd

class StoppableXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
        """
        Overwritten XMLRPC-Server class, since the original one cannot be stopped cleanly.
        catching the KeyboardInterruptException will shutdown the server.
        Here, we're shutting down at any exception to free the socket again.
        """

        allow_reuse_address = True

        def serve_forever(self):
                self.stop = False
                while not self.stop:
                        try:
                                self.handle_request()
                        except:
                                self.server_close()
                                print "server closed"
                                exit(0)

server = StoppableXMLRPCServer(("localhost",50505))
server.register_instance(KerioFunctions())
server.serve_forever()

Edit by Gerold: Ich habe daraus ein neues Thema gemacht.

Verfasst: Donnerstag 11. Juni 2009, 00:09
von Barabbas
server.shutdown() sollte helfen

Verfasst: Donnerstag 11. Juni 2009, 06:21
von py_lo
Ups, doch aus Versehen ein neues Thema erstellt :oops:

server.shutdown() bewirkt leider nicht das gewünschte.
Der Client wird beendet aber SERVER.PY läuft weiter - schlimmer noch
lässt sich auch nicht mehr mit "ctrl-c " beenden.

Ich möchte gerne das das Script SERVER.PY beendet wird.

SERVER.PY (so hab ich es versucht...)

Code: Alles auswählen

...
 def exe_xbmc(self, rs_cmd):
                if rs_cmd == ("shutdown"):
                        server.shutdown()
                        exit(0)
                return "You sent: %s" %rs_cmd
...

Hier mal eine gekürzte Form vom Client:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import socket, serial

# PorOeffnen mit "19200,8,N,1" 1s timeout
try:
        ser = serial.Serial('/dev/ttyS0', 19200, timeout=5)
except:
        print "Port konnte nicht geoeffnet werden!"

socket.setdefaulttimeout(3) # Timeout auf 3 sec. setzen
import xmlrpclib

server = xmlrpclib.ServerProxy("http://localhost:50505")


while 1:
 command = ser.readline()
 if command:
        command = command.translate(None, chr(13)+chr(10)) # /CR /LF  aus String entfernen
        returned = server.exe_xbmc(command)
        print returned

        if command == ("stop"): break

print "ENDE"
server.exe_xbmc("stop")
ser.close()

Verfasst: Donnerstag 11. Juni 2009, 06:48
von BlackJack
@py_lo: Also hier passt ganz offensichtlich nicht zusammen, dass der Client "stop" sendet, der Server aber auf "shutdown" reagiert.

Erstell doch mal ein minimales, lauffähiges Beispiel, das das Problem zeigt. Am besten mit Daten die vom Benutzer eingegeben werden, statt über die serielle Schnittstelle.

Edit: Warum setzt Du Zeichenketten in Klammern!?

Verfasst: Donnerstag 11. Juni 2009, 07:12
von py_lo
Okay, erledigt.
Das mit "stop" und "shutdown" hab ich zum testen mal gemacht.
Stop beendet den Client und Shutdown soll den Server beenden.
(dich hatte wohl die vorletzte Zeile irritiert? - die war umsonst)

Die Klammern? Is wohl ne macke von mir :D
Unnötig aber auch nicht schlimm, oder?

SERVER:

Code: Alles auswählen

#!/usr/bin/env python
import SimpleXMLRPCServer
from os import popen
from sys import exit

class KerioFunctions:
        def __init__(self):
                import string
                self.python_string = string

        def exe_xbmc(self, rs_cmd):
                print rs_cmd
                if rs_cmd == ("shutdown"):
                       server.shutdown()
#                       server.close()
                return "You sent: %s" %rs_cmd

class StoppableXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):

        allow_reuse_address = True

        def serve_forever(self):
                self.stop = False
                while not self.stop:
                        try:
                                self.handle_request()
                        except:
                                self.server_close()
                                print "server closed"
                                exit(0)

server = StoppableXMLRPCServer(("localhost",50505))
server.register_instance(KerioFunctions())
server.serve_forever()

CLIENT:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import socket
socket.setdefaulttimeout(1)
import xmlrpclib

server = xmlrpclib.ServerProxy("http://localhost:50505")

while 1:
 command = raw_input("Cmd:" )
 if command:
        returned = server.exe_xbmc(command)
        print returned
        if command == ("stop"): break
 else:
        print "Nix eingeben"
print "ENDE"

Verfasst: Donnerstag 11. Juni 2009, 09:44
von veers
Vermutlich suchst du das:
SocketServer Dokumentation hat geschrieben:When inheriting from ThreadingMixIn for threaded connection behavior, you should explicitly declare how you want your threads to behave on an abrupt shutdown. The ThreadingMixIn class defines an attribute daemon_threads, which indicates whether or not the server should wait for thread termination. You should set the flag explicitly if you would like threads to behave autonomously; the default is False, meaning that Python will not exit until all threads created by ThreadingMixIn have exited.
Gruss,
Jonas

Verfasst: Donnerstag 11. Juni 2009, 12:40
von gerold
Hallo py_lo!

Vielleicht bringt dich das http://www.python-forum.de/topic-19195.html weiter.

mfg
Gerold
:-)

Verfasst: Donnerstag 11. Juni 2009, 12:54
von gerold
Hallo py_lo!

Und hier ist die einfachere Variante: http://www.python-forum.de/topic-19194.html

mfg
Gerold
:-)

Verfasst: Donnerstag 11. Juni 2009, 13:33
von py_lo
Hi gerold,

mann super! Danke, das sieht echt gut aus. -werds nachher testen.
Wieso hab ich das bloß nicht gefunden???

Auch noch mal ein allgemeines Lob an das Forum - so schnell wie hier
bekommt man seine Antworten woanders nur sehr selten, weiter so. :mrgreen:

Okay genug anerkennende Worte, an die Arbeit!

Verfasst: Donnerstag 11. Juni 2009, 15:42
von Leonidas
py_lo hat geschrieben:Wieso hab ich das bloß nicht gefunden???
Weil Gerold die Threads erst jetzt erstellt hat.