Wie XMLRPC-Server beenden?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

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.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

server.shutdown() sollte helfen
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

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()
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!?
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

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"
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo py_lo!

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

mfg
Gerold
:-)
Zuletzt geändert von gerold am Donnerstag 11. Juni 2009, 13:01, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo py_lo!

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

py_lo hat geschrieben:Wieso hab ich das bloß nicht gefunden???
Weil Gerold die Threads erst jetzt erstellt hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten