[python-win32] SimpleXMLRPCServer Windows service

John Ferrell jferrell at rhsmith.umd.edu
Thu Apr 27 16:19:31 CEST 2006


I am trying to create a Windows service using SimpleXMLRPCServer and 
win32serviceutil.  The service itself seems to be working properly 
(starts, stops, etc) and I can connect using an XMLRPC client from the 
localhost.  However when I connect from a remote client, I either get a 
socket error or an xmlrpclib.ProtocolError error.  If I use 
serve_forever() rather than handle_request(), the remote clients can 
connect but it breaks the Windows service functionality (can't stop the 
service).  It would seem that the problem is related to the way the 
service handles remote connections, but I cannot figure out what the 
problem is. 

I have searched around, but can't find any example code.  Hopefully 
someone can point me in the right direction.

thanks,
John

## XML-RPC Service
import win32serviceutil
import win32service
import win32event
import win32evtlogutil
import win32file
import servicemanager
import SimpleXMLRPCServer

class OBJECT:
    def hello(self):
        return "Hello World"

class XMLRPCSERVICE(win32serviceutil.ServiceFramework):
    _svc_name_ = "XMLRPCSERVICE"
    _svc_display_name_ = "XMLRPCSERVICE"
    _svc_description_ = "XMLRPCSERVICE"
 
    def __init__(self, args):
        win32evtlogutil.AddSourceToRegistry(self._svc_display_name_, 
sys.executable, "Application")
        win32serviceutil.ServiceFramework.__init__(self, args)
 
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.hSockEvent = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        ## Write a started event
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_, ' (%s)' % self._svc_name_))
 
        server = SimpleXMLRPCServer.SimpleXMLRPCServer(("", 8080))
        object = OBJECT()
        server.register_instance(object)
 
        while 1:
            win32file.WSAEventSelect(server, 
self.hSockEvent,win32file.FD_ACCEPT) 
            rc = 
win32event.WaitForMultipleObjects((self.hWaitStop,self.hSockEvent), 0, 
win32event.INFINITE)
            if rc == win32event.WAIT_OBJECT_0:
                break
            else:
                win32file.WSAEventSelect(server,self.hSockEvent, 0)
                server.handle_request()
                #server.serve_forever()  ## Works, but breaks the Windows 
service functionality
 
        ## Write a stopped event
        win32evtlogutil.ReportEvent(self._svc_name_,
                                    servicemanager.PYS_SERVICE_STOPPED,0,
 servicemanager.EVENTLOG_INFORMATION_TYPE,
                                    (self._svc_name_,""))

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(XMLRPCSERVICE)

------------------------------------------------------------------------------------------------------
## XML-RPC Client
import xmlrpclib

server = xmlrpclib.ServerProxy("http://remoteserver:8080")
print server.hello()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-win32/attachments/20060427/0e57df10/attachment.html 


More information about the Python-win32 mailing list