在php中通过JSON RPC与go通讯的实例代码分享

本文是关于PHP的知识教程分享,分享下在php中通过JSON RPC与go通讯的实例代码,详细内容请看本文。


在php中通过JSON RPC与go通讯的实例代码分享


在php中通过JSON RPC与go通讯的实例代码分享


go 服务:


package main
import (
"fmt"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
  
type Calc struct{}
  
type Args struct {
A  float64 `json:"a"`
B  float64 `json:"b"`
Op string  `json:"op"`
}
  
type Reply struct {
Msg  string  `json:"msg"`
Data float64 `json:"data"`
}
  
  
// 第一个是参数是获取客户端传来的数据,第二个参数是返回的数据
  
func (c *Calc) Compute(args Args, reply *Reply) error {
var (
msg string = "ok"
)
  
switch args.Op {
case "+":
reply.Data = args.A + args.B
case "-":
reply.Data = args.A - args.B
case "*":
reply.Data = args.A * args.B
case "/":
if args.B == 0 {
msg = "in divide op, B can't be zero"
} else {
reply.Data = args.A / args.B
}
default:
msg = fmt.Sprintf("unsupported op:%s", args.Op)
}
reply.Msg = msg
  
if reply.Msg == "ok" {
return nil
}
return fmt.Errorf(msg)
}
  
  
// 启动server端
func main() {
err := rpc.Register(new(Calc))
  
if err != nil {
panic(err)
}
     
listener, err := net.Listen("tcp", "127.0.0.1:8181")
if err != nil {
panic(err)
}
  
for {
conn, err := listener.Accept()
  
if err != nil {
log.Println(err)
continue
}
  
go jsonrpc.ServeConn(conn)
}
}


php 客户端:


public function Call($method, $params) {
      $this->conn = fsockopen('127.0.0.1', 8181, $errno, $errstr, 3);
      if (!$this->conn) {
          return false;
      }
      $err = fwrite($this->conn, json_encode(array(
              'method' => $method,
              'params' => array($params),
              'id'     => 12345,
          ))."\n");
      if ($err === false)
          return false;
      stream_set_timeout($this->conn, 0, 3000);
      $line = fgets($this->conn);
      if ($line === false) {
          return NULL;
      }
      return json_decode($line,true);
  }
 
 
  public function Test() {
      //访问结构体 Calc 下 Compute 方法
      $res = $this->Call("Calc.Compute",array('A'=>1,'B'=>2,'Op'=>'+'));
      return $res;
  }


返回结果:


{
    "id": 12345,
    "result": {
        "msg": "ok",
        "data": 3
    },
    "error": null
}


以上就是关于php如何通过JSON RPC与go通讯的解析,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题