一、jsonrpc包json
該實現了JSON-RPC的ClientCodec和ServerCodec接口,可用於rpc包。網絡
可用於跨語言使用go rpc服務。併發
二、經常使用方法tcp
(1)func Dial(network, address string) (*rpc.Client, error)ide
Dial在指定的網絡和地址鏈接一個JSON-RPC服務端。函數
(2)func NewClient(conn io.ReadWriteCloser) *rpc.Clientspa
NewClient返回一個新的rpc.Client,以管理對鏈接另外一端的服務的請求。線程
(3)func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodecblog
NewClientCodec返回一個在鏈接上使用JSON-RPC的rpc.ClientCodec。接口
(4)func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
NewServerCodec返回一個在鏈接上使用JSON-RPC的rpc. ServerCodec。
(5)func ServeConn(conn io.ReadWriteCloser)
ServeConn在單個鏈接上執行DefaultServer。
ServeConn會阻塞,服務該鏈接直到客戶端掛起。
調用者通常應另開線程調用本函數:"go serveConn(conn)"。
ServeConn在該鏈接使用JSON編解碼格式。
三、代碼示例
package main import ( "errors" "fmt" "log" "net" "net/rpc" "net/rpc/jsonrpc" ) // Args 參數 type Args struct { A, B int } // Quotient 商、餘數 type Quotient struct { Quo, Rem int } // Arith 算術服務 type Arith int // Multiply 乘法服務 func (*Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } // Divide 除法服務 func (*Arith) Divide(args *Args, quo *Quotient) error { if args.B == 0 { return errors.New("除數不能爲零") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil } // 錯誤檢查 func checkErr(err error) { if err != nil { log.Fatalln(err) } } func main() { //註冊服務 err := rpc.Register(new(Arith)) checkErr(err) //設置監聽 lis, err := net.Listen("tcp", "127.0.0.1:1234") checkErr(err) //服務端等待請求 go func(lis net.Listener) { for { conn, err := lis.Accept() if err != nil { continue } // 併發處理客戶端請求 go func(conn net.Conn) { jsonrpc.ServeConn(conn) }(conn) } }(lis) //客戶端請求服務 client, err := jsonrpc.Dial("tcp", ":1234") checkErr(err) defer client.Close() //乘法 args := &Args{A: 17, B: 3} var reply int err = client.Call("Arith.Multiply", args, &reply) checkErr(err) fmt.Printf("Arith.Multiply:%d * %d = %d\n", args.A, args.B, reply) //除法 quotient := new(Quotient) call := client.Go("Arith.Divide", args, quotient, nil) <-call.Done fmt.Printf("Arith.Divide:%d / %d = %d .... %d\n", args.A, args.B, quotient.Quo, quotient.Rem) } //輸出 // Arith.Multiply:17 * 3 = 51 // Arith.Divide:17 / 3 = 5 .... 2