El siguiente programa (Servidor) esta diseñado para atender solicitudes de "Estado del Tiempo" vía XMLRPC bajo el puerto TCP 12000 de la máquina local (localhost); después se observará como este mismo Servidor puede atender solicitudes de otros Clientes que no están escritos en Python.
En base a su ambiente puede generar el siguiente Servidor XMLRPC
Asegúrese que ningún otro Servidor este corriendo bajo el mismo puerto
|
Código Fuente ServicioClima Servidor Python en XMLRPC
#!/usr/bin/python import SocketServer, BaseHTTPServer import xmlrpclib import sys import string |
def elclima(argumentos):
pais = string.lower(argumentos[0])
if pais == 'china':
respuesta = "china : Humedo"
elif pais == 'australia':
respuesta = "australia : Nublado"
elif pais == 'israel':
respuesta = "israel : Terrorismo..."
else:
respuesta = pais + " no esta disponible , por favor elija entre [china|australia|israel]"
return respuesta
|
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_POST(self):
try:
# extraer argumentos
data = self.rfile.read(int(self.headers["content-length"]))
params, method = xmlrpclib.loads(data)
# generar respuesta
try:
response = self.call(method, params)
if type(response) != type(()):
response = (response,)
except:
# reportar errores
response = xmlrpclib.dumps(
xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value))
)
else:
response = xmlrpclib.dumps(
response,
methodresponse=1
)
except:
# error interno, reportar como error HTTP
self.send_response(500)
self.end_headers()
else:
# respuesta valida de HTTP
self.send_response(200)
self.send_header("Content-type", "text/xml")
self.send_header("Content-length", str(len(response)))
self.end_headers()
self.wfile.write(response)
# cerrar conexion
self.wfile.flush()
self.connection.shutdown(1)
def call(self, method, params):
if method == "clima.mundial":
return elclima(params)
else:
raise xmlrpclib.Fault(777, "Método no definido en XMLRPC")
|
if __name__ == '__main__':
print "Inicializando el Servidor XML-RPC en el puerto 12000...";
print "Aceptando solicitudes (Ctrl-C para terminar el Servidor...realize otra llamada del Cliente para finalizar)"
server = SocketServer.TCPServer(('', 12000), RequestHandler)
server.serve_forever()
|
El primer paso es declarar las librerías que serán utilizadas por el Servidor XMLRPC.
Se define el método
elclimaque será utilizado para responder a las requisiciones del Cliente.La clase
RequestHandlercontiene código empleado para redireccionar las solicitudes que arriben al Cliente.El último método dentro de esta clase es el que redirecciona las solicitudes hacia el método
elclima.La sección final despliega mensajes a pantalla .
