简介
在上一篇文章中我们介绍了 Go 标准库net/rpc
的用法。在默认情况下,rpc
库内部使用gob
格式传输数据。我们仿造gob
的编解码器实现了一个json
格式的。实际上标准库net/rpc/jsonrcp
中已有实现。本文是对上一篇文章的补充。
快速使用
标准库无需安装。
首先是服务端,使用net/rpc/jsonrpc
之后,我们就不用自己去编写json
的编解码器了:
package main
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type Args struct {
A, B int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func main() {
l, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("listen error:", err)
}
arith := new(Arith)
rpc.Register(arith)
for {
conn, err := l.Accept()
if err != nil {
log.Fatal("accept error:", err)
}
// 注意这一行
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
直接调用jsonrpc.NewServerCodec(conn)
创建一个服务端的codec
。客户端也是类似的:
func main() {
conn, err := net.Dial("tcp", ":1234")
if err != nil {
log.Fatal("dial error:", err)
}
// 这里,这里????
client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
args := &Args{7, 8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal("Multiply error:", err)
}
fmt.Printf("Multiply: %d*%d=%d\n", args.A, args.B, reply)
}
先运行服务端程序:
$ go run main.go
然后在一个新的控制台中运行客户端程序:
$ go run client.go
Multiply: 7*8=56
下面这段代码基本上每个使用jsonrpc
的程序都要编写:
conn, err := net.Dial("tcp", ":1234")
if err != nil {
log.Fatal("dial error:", err)
}
client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
因此jsonrpc
为了方便直接提供了一个Dial
方法。使用Dial
简化上面的客户端程序:
func