package main import ( "fmt" "net" "net/rpc" "log" "net/http" ) 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 makeService() { func Register(rcvr interface{}) error 将Service(Arith)注册到默认的Server中 */ rpc.Register(new(Arith)) func HandleHTTP() RPC消息有HTTP Handler来处理, Handler注册到默认的Server */ rpc.HandleHTTP() func Listen(net, laddr string) (Listener, error) 第一个参数为面向流的网络("tcp", "tcp4", "tcp6", "unix", "unixpacket"). 第二个参数为字符串形式的地址, 如"127.0.0.1:1234", 省略host表示可以监听所有host */ l, e := net.Listen("tcp", ":1234") if e != nil { log.Fatal("listen error:", e) } func Serve(l net.Listener, handler Handler) error */ go http.Serve(l, nil) } func makeClient() { func DialHTTP(network, address string) (*Client, error) 参数类似于net.Listen */ client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234") defer client.Close() if err != nil { log.Fatal("dialing:", err) } args := &Args{7, 8} var reply int func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error client的方法, 第一个参数为调用服务的方法, 第二个参数方法需要的参数, 第三个参数为执行结果 */ err = client.Call("Arith.Multiply", args, reply) if err != nil { log.Fatal("Arith rpc call error:", err) } fmt.Println(reply) } func main() { makeService() makeClient() }
|