2012年9月5日 星期三

Python - XML-RPC簡易實作

Python版本:3.2

最近在用XML-RPC實現server與client之間的互動,底下是簡單的訊息互傳範例:

Server端

#Python 2
#import SimpleXMLRPCServer
#Python 3
import xmlrpc.server

host = "127.0.0.1"
port = 1234

def handle(msg):
    #Python 2
    #print "Handle message: " + msg
    #Python 3
    print("Handle message: " + msg)

    ret = "Hello! I have received your message."
    return ret

def main():
    #Python 2
    #server = SimpleXMLRPCServer.SimpleXMLRPCServer((host, port))
    #Python 3
    server = xmlrpc.server.SimpleXMLRPCServer((host, port))

    server.register_function(handle)
    server.serve_forever()

if __name__ == "__main__":
    main()

Client端

#Python 2
#import xmlrpclib
#Python 3
import xmlrpc.client

host = "http://127.0.0.1:1234"

def main():
    #Python 2
    #server = xmlrpclib.ServerProxy(hots)
    #Python 3
    server = xmlrpc.client.ServerProxy(host)

    result = server.handle("Welcome.")

    #Python 2
    #print result
    #Python 3
    print(result)

if __name__ == "__main__":
    main()

有一些地方要注意:
  1. Python 2和Python 3的xmlrpc library不同,範例裡有用註解表示Python 2的寫法。
  2. Python 2和Python 3的print也不同。
  3. SimpleXMLRPCServer()的參數是tuple型態,host要給字串,port要給整數。
  4. server的host設定為127.0.0.1,client就只能連線到127.0.0.1;換句話說,server的host若設定成192.168.1.1,client即使在本機,也不能透過127.0.0.1連線,只能連線到192.168.1.1。
  5. client端呼叫一次server端的handle(),socket連線即結束;要再次呼叫的話,要再執行一次ServerProxy()。
  6. server端可以一次註冊多個function。
  7. serve_forever()要放在最後面呼叫,因為呼叫完即進入server的main routine。

沒有留言: