go实现rpc
2022-10-12 本文已影响0人
耍帅oldboy
1、服务端
package main
import (
"fmt"
"net"
"net/http"
"net/rpc"
)
type Server struct {
}
type Req struct {
NumOne int
NumTow int
}
type Res struct {
Num int
}
func (s *Server) Add(req Req, res *Res) error {
res.Num = req.NumOne + req.NumTow
return nil
}
func main() {
rpc.Register(new(Server))
rpc.HandleHTTP()
l, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println(err)
return
}
http.Serve(l, nil)
}
2、客户端
package main
import (
"fmt"
"net/rpc"
)
type Req struct {
NumOne int
NumTow int
}
type Res struct {
Num int
}
func main() {
req := Req{
NumOne: 1,
NumTow: 2,
}
var res Res
client, err := rpc.DialHTTP("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println(err)
return
}
// 同步调用
//client.Call("Server.Add", req, &res)
//fmt.Println(res)
//异步调用
ca := client.Go("Server.Add", req, &res, nil)
for {
select {
case <-ca.Done:
fmt.Println(res)
return
default:
fmt.Println("处理别的任务")
}
}
}