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是由调用方维护的唯一的调用编号。