我们用php代码来调用go的json协议的rpc服务。
go的服务代码:

  1. package main
  2. import (
  3. "net/rpc"
  4. "net"
  5. "log"
  6. "net/rpc/jsonrpc"
  7. )
  8. //自己的数据类
  9. type MyMath struct{
  10. }
  11. //加法--只能两个参数
  12. func (mm *MyMath) Add(num map[string]float64,reply *float64) error {
  13. *reply = num["num1"] + num["num2"]
  14. return nil
  15. }
  16. //减法--只能两个参数
  17. func (mm *MyMath) Sub(num map[string]string,reply *string) error {
  18. *reply = num["num1"] + num["num2"]
  19. return nil
  20. }
  21. func main() {
  22. //注册MyMath类,以代客户端调用
  23. rpc.Register(new(MyMath))
  24. listener, err := net.Listen("tcp", ":1215")
  25. if err != nil {
  26. log.Fatal("listen error:", err)
  27. }
  28. for {
  29. conn, err := listener.Accept()
  30. if err != nil {
  31. continue
  32. }
  33. //新协程来处理--json
  34. go jsonrpc.ServeConn(conn)
  35. }
  36. }

php调用代码:

  1. <?php
  2. class JsonRPC
  3. {
  4. private $conn;
  5. function __construct($host, $port) {
  6. $this->conn = fsockopen($host, $port, $errno, $errstr, 3);
  7. if (!$this->conn) {
  8. return false;
  9. }
  10. }
  11. public function Call($method, $params) {
  12. if ( !$this->conn ) {
  13. return false;
  14. }
  15. $err = fwrite($this->conn, json_encode(array(
  16. 'method' => $method,
  17. 'params' => array($params),
  18. 'id' => 0,
  19. ))."\n");
  20. if ($err === false)
  21. return false;
  22. stream_set_timeout($this->conn, 0, 3000);
  23. $line = fgets($this->conn);
  24. if ($line === false) {
  25. return NULL;
  26. }
  27. return json_decode($line,true);
  28. }
  29. }
  30. $client = new JsonRPC("127.0.0.1", 1215);
  31. $r = $client->Call("MyMath.Add",array('num1'=>1,'num2'=>2));
  32. var_export($r);
  33. echo "<br/>";
  34. $r = $client->Call("MyMath.Sub",array('num1'=>'1','num2'=>'2'));
  35. var_dump($r);

这样我们就可以在php与go之间调用了

分类: web

标签:   golang