這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
github:https://github.com/ZhangzheBJUT/blog/blob/master/golang_rpc.md
一 HTTP RPC
服務端代碼
package mainimport ("errors""fmt""net/http""net/rpc")const ( URL = "192.168.2.172:12981")type Args struct { A, B int}type Quotient struct { Quo, Rem int}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil}func (t *Arith) Divide(args *Args, quo *Quotient) error{ if args.B == 0 { return errors.New("divide by zero!") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil}func main() { arith := new(Arith) rpc.Register(arith) rpc.HandleHTTP() err := http.ListenAndServe(URL, nil) if err != nil { fmt.Println(err.Error()) }}
用戶端代碼
package mainimport ( "fmt" "net/rpc”)const ( URL = "192.168.2.172:12982")func main() { client, err := rpc.DialHTTP("tcp", URL) if err != nil { fmt.Println(err.Error()) } args := Args{2, 4} var reply int err = client.Call("Arith.Multiply", &args, &reply) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(reply) }}
二 JSON-RPC
伺服器端代碼
package mainimport ("errors""fmt""net""net/rpc""net/rpc/jsonrpc")const ( URL= "192.168.2.172:12981")type Args struct { A, B int}type Quotient struct { Quo, Rem int}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil}func (t *Arith) Divide(args *Args, quo *Quotient) error { if args.B == 0 { return errors.New("divide by zero!") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil}func main() { arith := new(Arith) rpc.Register(arith) tcpAddr, err := net.ResolveTCPAddr("tcp", URL) if err != nil { fmt.Println(err) } listener, err := net.ListenTCP("tcp", tcpAddr) for { conn, err := listener.Accept() if err != nil { continue } go jsonrpc.ServeConn(conn) }}
用戶端代碼
package mainimport ( "fmt" "net/rpc”)const ( URL = "192.168.2.172:12982")func main() { client, err := jsonrpc.Dial("tcp", URL) defer client.Close() if err != nil { fmt.Println(err) } args := Args{7, 2} var reply int err = client.Call("Arith.Multiply", &args, &reply) if err != nil { fmt.Println(err) } fmt.Println(reply) }