新Sir

导航

 

 

rpc服务端

package main

import (
    "log"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

type HelloService struct {
}

func (p *HelloService) Hello(request string, reply *string) error {
    *reply = "Hello:" + request
    return nil

}

// 给予json 编码重新实现rpc
func main() {
    rpc.RegisterName("HelloService", new(HelloService))
    listener, err := net.Listen("tcp", ":6666")
    if err != nil {
        log.Fatal("listenTCP error:", err)
    }
    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal("accept error:", err)
        }
        go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
    }

}

 

基于jsonrpc的客户端

package main

import (
    "fmt"
    "log"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
)

func main() {
    //conn, err := net.Dial("tcp", "119.91.140.xx:8081") // 还一个 linux 机器 开启的服务 查看 请求数据的格式
    conn, err := net.Dial("tcp", "localhost:6666")
    if err != nil {
        log.Fatal("net.Dial:", err)
    }
    client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
    var reply string
    err = client.Call("HelloService.Hello", "Stefan", &reply)

    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(reply)

}

 

 

客户端 调用结果

 

 

 

 

客户端调用时发送的数据格式。例如,通过命令nc -l 1234在同样的端口启动一个TCP服务。然后再次执行一次RPC调用将会发现nc输出了以下的信息:

 

在linux 机器 开启一个 tpc  然后用客户端调用测试 如下

 

[root@VM-16-9-centos ~]# nc -l 8081
{"method":"HelloService.Hello","params":["Stefan"],"id":0}

 

 

这是一个JSON编码的数据,其中method部分对应要调用的由RPC服务和方法组合成的名字,params部分的第一个元素为参数,id是由调用方维护的唯一的调用编号。

 

posted on 2022-05-06 14:40  新Sir  阅读(88)  评论(0编辑  收藏  举报