This is a creation in Article, where the information may have evolved or changed.
Github:https://github.com/zhangzhebjut/blog/blob/master/golang_rpc.md
An HTTP RPC
Service-side code
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()) }}
Client code
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) }}
Two Json-rpc
Server-side code
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) }}
Client code
package mainimport ("FMT" "Net/rpc") const (URL = "192.168.2.172:12982") Func ma In () {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)}