go rpc example - modrpc/info GitHub Wiki
-
Server-side
- arith := new(Arith)
- rpc.Register(arith)
- rpc.HandleHTTP()
- http.Handle(rpcPath, server /* DefaultServer */)
- l = net.Listen("tcp", ":1234")
- go http.Serve(l /* *http.ResponseWrite */, nil /* httpReqest* */)
- server.HandleHTTP(l, nil)
- conn = l.(http.Hijacker).Hijack()
- server.ServeConn(conn)
- buf := bufio.NewWriter(conn)
- codec := &gobServeCodec(conn, NewDecoder(conn), NewEncoder(buf), buf)
- server.ServeCodec(codec)
- service, mtype, req, argv, ... := server.readRequest(codec)
- go service.call(server, sending, mtype, req, argv, replyv, codec)
- function := mtype.method.Func
- retval := func.Call([]reflect.Value(s.rcvr, argv, replyv})
- server.sendResponse(sendijng, req, ...)
-
Client-side: Synchronous call
- args := &server.Args{7, 8}
- var reply int
- client.Call("Arith.Multiply", args, &reply)
- <-client.Go("Arith.Multiply", args.replay, make(chan *Call, 1)).Done
-
Client-side: Asynchronous call
- args := &server.Args{7, 8}
- var reply int
-
mycall := client.Go("Arith.Multiply", args, &reply)
- call := new(Call)
- call.ServiceMethod = "Arith.Multiply"
- call.Args = args
- call.Reply = reply
- done = make(chan *Call, 10) // buffered
- call.Done = done
-
client.send(call)
- seq := client.seq
- client.mutext.Lock()
- client.seq++
- client.pending[seq] = call
- client.mutext.Unlock()
-
<-
mycall.Done
⚠️ **GitHub.com Fallback** ⚠️