PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。
遇到的问题总结:
Fatal error: Cannot redeclare gzdecode() in
1、重命名compat.php、phprpc_client.php的gzdecode(和系统函数冲突)函数为gzdecode_other
Non-static method PHPRPC_Server::initSession() should not be called statically
2、修改phprpc_server.php文件里面initSession函数的类型为static即可。
3、phprpc_client.php 472行警告:
Notice: Undefined offset in phprpc_client.php line 472
修改成
$arr = explode(‘=‘, $c, 2);
if(count($arr)>1)
{
list($name, $value)=$arr;
if (!in_array($name, array(‘domain‘, ‘expires‘, ‘path‘, ‘secure‘))) {
$_PHPRPC_COOKIES[$name] = $value;
}
}
4、Warning: The magic method __get() must have public visibility and cannot be static in compat.php(235) : eval()‘d code on line 3
改成public:
eval(‘
class ‘ . $classname . ‘ {
public function __get($name) {
php server端
<?php include (‘php/phprpc_server.php‘); include ‘entitys.php‘; function hello($name) { return ‘Hello ‘ . $name; } $server = new PHPRPC_Server(); $server->setCharset(‘UTF-8‘); $server->setDebugMode(true); $server->setEnableGZIP(true); $server->add(‘hello‘); $server->add(‘sort‘); //$server->add(array(‘hello‘,‘md5‘,‘sha1‘)); $server->add(‘getcwd‘);//导出php内置函数 $server->add(‘add‘, new Calculator()); $server->add(‘mul‘, new Calculator()); $server->add(‘div‘, new Calculator()); $server->add(‘sub‘, new Calculator()); $server->add(‘fuck‘, new Calculator()); $server->add(‘getstudent‘, new Calculator()); $server->add(‘getstudents‘, new Calculator()); $server->start(); ?>
<?php class Student { public $id; public $name; public $age; } /** * Calculator - sample class to expose via JSON-RPC */ class Calculator { /** * Return sum of two variables * * @param int $x * @param int $y * @return int */ public function add($x, $y) { return $x + $y; } /** * Return difference of two variables * * @param int $x * @param int $y * @return int */ public function sub($x, $y) { return $x - $y; } /** * Return product of two variables * * @param int $x * @param int $y * @return int */ public function mul($x, $y) { return $x * $y; } /** * Return the division of two variables * * @param int $x * @param int $y * @return float */ public function div($x, $y) { return $x / $y; } public function fuck($str, $x, $y) { $m = $x + $y; return ‘fuck 日本‘ . $str . $m; } public function getstudent($student) { $student = new Student(); $student->id = 110; $student->name = ‘php‘; $student->age = 21; return $student; } public function getstudents($id) { $entitys = array(); for ($i=0;$i<10;$i++) { $student = new Student(); $student->id = $i; $student->name = ‘中文php‘.$i; $student->age = 21; array_push($entitys, $student); } return $entitys; } } ?>
php client客户端
<?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client(‘http://localhost/phprpc/index.php‘); echo ‘<br/>‘; $ret=$client->add(12,32); print_r($ret); echo ‘<br/>‘; $ret=$client->mul(12,32); print_r($ret); echo ‘<br/>‘; $ret=$client->fuck(‘xx测试‘,12,32); print_r($ret); echo ‘<br/>‘; $ret=$client->hello(‘xx测试‘,12,32); print_r($ret); echo ‘<br/>‘; $ret=$client->getstudent(‘getstudent‘); print_r($ret); echo ‘<br/>‘; $ret=$client->getstudents(‘getstudents‘); print_r($ret); echo ‘<br/>‘; print_r($client->getOutput()); ?>
java 客户端:
package com.jiepu.client; import org.phprpc.PHPRPC_Client; import org.phprpc.util.AssocArray; import org.phprpc.util.Cast; public class IncClient { // http://leyteris.iteye.com/blog/1004669 //http://www.phprpc.org/zh_CN/docs/ //android下面也一样 public static void main(String[] args) { PHPRPC_Client client = new PHPRPC_Client( "http://10.0.0.108/phprpc/index.php"); System.out.println(client.invoke("add", new Object[] { 12, 32 })); System.out.println(client.invoke("sub", new Object[] { 12, 32 })); System.out.println(client.invoke("mul", new Object[] { 12, 32 })); System.out.println(client.invoke("div", new Object[] { 12, 32 })); System.out.println(Cast.toString(client.invoke("fuck", new Object[] { "hehe你好", 12, 32 }))); System.out.println(Cast.toString(client.invoke("getcwd", new Object[] {}))); System.out.println(Cast.toString(client.invoke("hello", new Object[] { "java" }))); //public公共类Student自动映射转换 Object obj=client.invoke("getstudent",new Object[] { "java" }); Student stu=(Student) Cast.cast(obj, Student.class); System.out.println(stu); /**手动转换 HashMap<Object, Object> objs = (HashMap<Object, Object>) client.invoke("getstudent", new Object[] { "java" }); if(objs.size()>0) { Student student = new Student(); student.setAge(Integer.parseInt(Cast.toString(objs.get("age")))); student.setName(Cast.toString(objs.get("name"))); student.setId(Integer.parseInt(Cast.toString(objs.get("id")))); System.out.println(student); System.out.println("==========="); }*/ AssocArray alist = (AssocArray) client.invoke("getstudents", new Object[] { "java" }); for (int i = 0; i < alist.size(); ++i) { // System.out.println(alist.get(i).getClass()); Student student=(Student) Cast.cast(alist.get(i), Student.class); System.out.println(student); } // System.out.println(client.getWarning()); } }
package com.jiepu.client; import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = 3475272786622279878L; private Integer id; private String name; private Integer age; @Override public String toString() { return "Student [age=" + age + ", id=" + id + ", name=" + name + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
android客户端:
package com.example.androidjsonrpc; import java.util.List; import org.alexd.jsonrpc.JSONRPCClient; import org.alexd.jsonrpc.JSONRPCException; import org.alexd.jsonrpc.JSONRPCParams.Versions; import org.phprpc.PHPRPC_Client; import org.phprpc.util.AssocArray; import org.phprpc.util.Cast; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.alibaba.fastjson.JSON; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void run(View view) { new Thread(new Runnable() { @Override public void run() { runinthread(); } }).start(); } public void runphprpc(View view) { new Thread(new Runnable() { @Override public void run() { runphprpc(); } }).start(); } private void runphprpc() { PHPRPC_Client client = new PHPRPC_Client( "http://10.0.0.108/phprpc/index.php"); System.out.println(client.invoke("add", new Object[] { 12, 32 })); System.out.println(client.invoke("sub", new Object[] { 12, 32 })); System.out.println(client.invoke("mul", new Object[] { 12, 32 })); System.out.println(client.invoke("div", new Object[] { 12, 32 })); System.out.println(Cast.toString(client.invoke("fuck", new Object[] { "hehe你好", 12, 32 }))); System.out.println(Cast.toString(client.invoke("getcwd", new Object[] {}))); System.out.println(Cast.toString(client.invoke("hello", new Object[] { "java" }))); //public公共类Student自动映射转换 Object obj=client.invoke("getstudent",new Object[] { "java" }); Student stu=(Student) Cast.cast(obj, Student.class); System.out.println(stu); /**手动转换 HashMap<Object, Object> objs = (HashMap<Object, Object>) client.invoke("getstudent", new Object[] { "java" }); if(objs.size()>0) { Student student = new Student(); student.setAge(Integer.parseInt(Cast.toString(objs.get("age")))); student.setName(Cast.toString(objs.get("name"))); student.setId(Integer.parseInt(Cast.toString(objs.get("id")))); System.out.println(student); System.out.println("==========="); }*/ AssocArray alist = (AssocArray) client.invoke("getstudents", new Object[] { "java" }); for (int i = 0; i < alist.size(); ++i) { // System.out.println(alist.get(i).getClass()); Student student=(Student) Cast.cast(alist.get(i), Student.class); System.out.println(student); } } public void runinthread() { // https://code.google.com/p/android-json-rpc/downloads/list // http://www.oschina.net/p/android-json-rpc JSONRPCClient client = JSONRPCClient.create( "http://10.0.0.107/json_server/server.php", Versions.VERSION_2); client.setConnectionTimeout(2000); client.setSoTimeout(2000); try { String string = client.callString("fuck", "android谷歌", 15, 32); Log.i("androidjsonrpc", "fuck=" + string); int i = client.callInt("add", 56, 25); Log.i("androidjsonrpc", i + ""); // Student student=(Student) client.call("getstudent", new // Student(1,"name",123)); // Log.i("androidjsonrpc", student.toString()); // Log.i("androidjsonrpc", client.call("getstudent", new // Student(1,"name",123)).toString()); // Log.i("androidjsonrpc", client.call("getstudents", // "xx").toString()); String str = client.callString("getstudent", new Student(1, "name", 123)); Log.i("androidjsonrpc", str); // fastjson 转换json字符串为对象 Student student = JSON.parseObject(str, Student.class); Log.i("androidjsonrpc", student.toString()); str = client.callString("getstudents", "xx"); Log.i("androidjsonrpc", str); // 使用到fastjson 转换json数组为list对象 List<Student> students = JSON.parseArray(str, Student.class); Log.i("androidjsonrpc", students.toString()); } catch (JSONRPCException e) { e.printStackTrace(); } } }
Delphi 客户端:
unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, PHPRPCSynaHttpClient, PHPRPC, PHPRPCClient, PHPRPCIdHttpClient, StdCtrls; type TForm4 = class(TForm) Button1: TButton; PHPRPCIdHttpClient1: TPHPRPCIdHttpClient; PHPRPCSynaHttpClient1: TPHPRPCSynaHttpClient; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TStudent = class(TPHPObject) private Fid: Integer; Fname: AnsiString; Fage: Integer; published property id: Integer read Fid write Fid; property name: AnsiString read Fname write Fname; property age: Integer read Fage write Fage; end; var Form4: TForm4; implementation {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject); var clientProxy: Variant; int_ret, i: Integer; string_ret: string; vhashmap: Variant; ohashmap: THashMap; arraylist, keys, values: TArrayList; key, value, tmp: Variant; student: TStudent; begin // http://www.phprpc.org/zh_CN/docs/ clientProxy := PHPRPCIdHttpClient1.useService (‘http://10.0.0.108/phprpc/index.php‘); int_ret := clientProxy.add(12, 52); ShowMessage(IntToStr(int_ret)); // 中文字符串参数要转换为UTF8编码 string_ret := clientProxy.fuck(AnsiToUTF8(‘xxx你好‘), 15, 45); // 中文的服务器输出的也是UTF8编码,本地打印要转换为本地编码 ShowMessage(UTF8ToAnsi(string_ret)); string_ret := clientProxy.getcwd(); ShowMessage(UTF8ToAnsi(string_ret)); string_ret := clientProxy.hello(AnsiToUTF8(‘xxx‘)); ShowMessage(UTF8ToAnsi(string_ret)); TStudent.RegisterClass(‘Student‘); tmp := clientProxy.getstudent(AnsiToUTF8(‘java‘)); // ShowMessage(UTF8ToAnsi(tmp)); // 转换为student对象 student := TStudent(TStudent.FromVariant(tmp)); ShowMessage(IntToStr(student.id) + ‘,‘ + UTF8ToAnsi(student.name)+ ‘,‘ + IntToStr (student.age)); vhashmap := clientProxy.getstudents(AnsiToUTF8(‘java‘)); ohashmap := THashMap(THashMap.FromVariant(vhashmap)); arraylist := ohashmap.ToArrayList; for i := 0 to arraylist.Count - 1 do begin // ShowMessage(arraylist.Items[i]); student := TStudent(TStudent.FromVariant(arraylist.Items[i])); ShowMessage(IntToStr(student.id) + ‘,‘ + UTF8ToAnsi(student.name)+ ‘,‘ + IntToStr (student.age)); end; arraylist.Free; { keys:=ohashmap.Keys; values:=ohashmap.Values; for i := 0 to keys.Count - 1 do begin key:=keys[i]; value:=values[i]; ShowMessage(values.List[i]); ShowMessage(value); // ohashmap := THashMap(THashMap.FromVariant(value)); //ShowMessage(ohashmap.Values[0].Properties[‘name‘]); end; } end; end.
来自:http://blog.csdn.net/earbao/article/details/46428565
源码下载:http://pan.baidu.com/s/1eQ6KOcq