golang代码:
package main
import (
"context"
"net"
"net/rpc"
"github.com/powerman/rpc-codec/jsonrpc2"
)
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
}
type exampleContextKey string
var RemoteAddrContextKey exampleContextKey = "RemoteAddr"
func main() {
rpc.Register(&App{})
//Server provide a TCP transport.
lnTCP, err := net.Listen("tcp", "127.0.0.1:6001")
if err != nil {
panic(err)
}
defer lnTCP.Close()
for {
conn, err := lnTCP.Accept()
if err != nil {
return
}
ctx := context.WithValue(context.Background(), RemoteAddrContextKey, conn.RemoteAddr())
go jsonrpc2.ServeConnContext(ctx, conn)
}
}
/******************************************************/
php代码:
composer require tivoka/tivoka
<?php
namespace app\index\controller;
use app\BaseController;
use think\facade\View;
use Tivoka\Client;
class Index extends BaseController
{
public function index()
{
//tcp
$connection = Client::connect(array('host' => '127.0.0.1', 'port' => 6001));
$connection->useSpec('2.0');
$request = $connection->sendRequest('App.Hi', ['name'=>'ceshi222']);
dd($request->result);
}
}