1、PHP客戶端
<?php
//xmlrpc_client.php
//XML-RPC客戶端演示程序
require('xmlrpc.inc');
$xmlrpc_internalencoding='UTF-8';
//創建client對象, 三個參數依次爲 path, hostname, port
#$s=new xmlrpc_client('/testxml/xmlrpc_server.php', 'localhost', 80);
$s=new xmlrpc_client('/', 'localhost', 8888);
//create xmlrpcval object, which allows the encoding of our variable
//創建xmlrpcval對象,將我們的PHP變量編碼爲XML-RPC需要的XML形式
#$inputString=new xmlrpcval('world勝利', 'string');
$inputString = php_xmlrpc_encode('勝利world');
//create an array of parameters
//儘管我們只有一個參數,但仍然要轉換成數組的形式,因爲xmlrpcmsg的第二個參數是一個參數表
$parameters=array($inputString);
//create the message object
//創建XML-RPC報文,參數分別爲 遠程方法名 和 參數表
$msg=new xmlrpcmsg('echoString', $parameters);
//$s->request_charset_encoding = 'utf-8';
//send the message, get the response
//發送報文,返回值$rsp爲一個xmlrpcresp對象,它包含以下三個方法:
//faultCode() 出錯代碼,如果成功將返回0
//faultString() 出錯信息
//value() 返回值,以xmlrpcval對象形式存在,PHP使用前需要進行解碼
$s->debug = true;
$rsp=$s->send($msg);
//check for errors
if($rsp->faultcode()==0) {
//decode the response to a PHP type
//xmlrpc_decode()函數用於將xmlrpcval對象解碼
$response=php_xmlrpc_decode($rsp->value());
//print results
print '<pre>';
var_dump($response);
print '</pre>';
} else {
//print errors
print 'Error: '.$rsp->faultcode().', '.$rsp->faultstring().'<br>';
}
//show messages
//然後我們來查看一下報文內容
$msg->createpayload();
print 'REQUEST:<xmp>'.$msg->payload.'</xmp>';
print 'RESPONSE:<xmp>'.$rsp->serialize().'</xmp>';
?>
2、Python服務端
# -*- coding:GB2312 -*-
import SimpleXMLRPCServer
#定義自己的CMS類
class MyCMS:
def getVersion(self):#向外公開版本的方法
return "Powerd By Python 0.1a"
def echoString(self, strs):
#return ("VPhello我" + strs).encode('utf_8')
s = u'我來自Python的世界!!'
#return s.encode('gb2312')
return s + strs
cms = MyCMS()
server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8888))#, encoding='utf_8')
server.register_instance(cms)
print "Listening on port 8888"
server.serve_forever()#服務器執行,並監聽8888端口
注意的是:
上面紅色標識的代碼不能正確運行,主要是由於Unicode的問題,在PHP中要採用php_xmlrpc_encode將所有的參數進行打包,而Python中如果返回的是Unicode字符串則必須明確指定是u"中文",否則也會出現編碼問題。