当前位置: 首页 > news >正文

php-golang-rpc 简单的jsonrpc实践

golang代码:

package main

import (

    "net"

    "net/rpc"

    "net/rpc/jsonrpc"

)

type App struct{}

type Res struct {

    Code int    `json:"code"`

    Msg  string `json:"msg"`

    Data any    `json:"data"`

}

func (*App) Hi(mp map[string]any, res *Res) error {

    res.Code = 200

    res.Msg = "成功"

    var rmp = make(map[string]any, 0)

    if v, ok := mp["name"].(string); ok {

        rmp["name"] = "my name is " + v

    } else {

        rmp["name"] = "my name is unknown"

    }

    res.Data = rmp

    return nil

}

func main() {

    ln, err := net.Listen("tcp", ":6001")

    if err != nil {

        panic(err)

    }

    rpc.Register(new(App))

    for {

        conn, err := ln.Accept()

        if err != nil {

            continue

        }

        go func(conn net.Conn) {

            jsonrpc.ServeConn(conn)

        }(conn)

    }

}

/**************************************************************/

php代码:

public function index()
    {
        //访问结构体 Calc 下 Compute 方法
        $res = $this->Call("App.Hi",['name'=>'ceshi222']);
        dd($res);

     }

public function Call($method, $params) {
        
        $conn = fsockopen('127.0.0.1', 6001, $errno, $errstr, 3);
        if (!$conn) {
            return false;
        }
        
        $err = fwrite($conn, json_encode(array(
            'method' => $method,
            'params' => array($params),
            'id'     => time(),
        ))."\n");
        if ($err === false){
            return false;
        }
        
        stream_set_timeout($conn, 0, 3000);
        $line = fgets($conn);
        if ($line === false) {
            return NULL;
        }
        return json_decode($line,true);
    }

/***********************************************/

php封装:

PHP 端的就送 rpc 调用:rpc_client.php

<?phpclass JsonRPC {private $conn;function __construct($host, $port) {$this->conn = fsockopen($host, $port, $errno, $errstr, 3);if (!$this->conn) {return false;}}public function Call($method, $params) {if (!$this->conn) {return false;}$err = fwrite($this->conn, json_encode(array('method' => $method,'params' => array($params),'id' => 0,)) . "\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);}
}
$client = new JsonRPC("127.0.0.1", 30002);
$r = $client->Call("ServiceCompute.Add", array('X' => 30, 'Y' => 40));
var_dump($r);
http://www.lryc.cn/news/96976.html

相关文章:

  • Apipost变量高亮展示,变量操作更流畅
  • SSIS对SQL Server向Mysql数据转发表数据 (完结)
  • vue+Element-ui实现树形组件、表格树
  • 【iPadOS 开发】打开 iPad 的开发者模式的方法
  • 矩阵对角线元素的和
  • 看了这篇文章,我也会用grid布局了
  • {“msg“:“invalid token“,“code“:401}
  • Qt Qml自定义模态对话框
  • 【前端知识】React 基础巩固(三十)——CSS编写方式
  • Langchain 集成 FAISS
  • 科技与人元宇宙论坛跨界对话
  • JAVA-生成二维码图片
  • 【iOS】iOS持久化
  • 基于Javaweb+Vue3实现淘宝卖鞋前后端分离项目
  • bat一键批量、有序启动jar
  • centos7安装mysql数据库详细教程及常见问题解决
  • C++ STL sort函数的底层实现
  • ICP算法和优化问题详细公式推导
  • 【安全狗】linux免费服务器防护软件安全狗详细安装教程
  • 【iOS】自定义字体
  • WPF实战学习笔记06-设置待办事项界面
  • 推荐几个不错的免费配色工具网站
  • gitee page发布的静态网站,无法播放目录中的mp4视频
  • opencv-26 图像几何变换04- 重映射-函数 cv2.remap()
  • SkyWalking链路追踪中span全解
  • 【前端知识】React 基础巩固(三十一)——Redux的简介
  • 拦截Bean使用之前各个时机的Spring组件
  • RT thread 之 Nand flash 读写过程分析
  • 独立站最全出单营销指南,新手卖家赶紧学起来吧!
  • Git移除commit过的大文件