jsonrpc
定义rpc方法:
type DemoService struct{}
type Args struct {
A, B int
}
// go要求的RPC调用方法必须为两个参数:一个args, 一个result。返回error
func (DemoService) Div(args Args, result *float64) error {
if args.B == 0 {
return errors.New("division by zero")
}
*result = float64(args.A) / float64(args.B)
return nil
}
server
func main() {
// 登记rpc接收方的方法
rpc.Register(rpcdemo.DemoService{})
// 创建一个tcp socket来监听1234端口,该端口用来监听rpc请求
listener, err := net.Listen("tcp", ":1234")
if err != nil {
panic(err)
}
defer listener.Close()
for {
// 接收rpc
conn, err := listener.Accept()
if err != nil {
log.Printf("accept error: %v", err)
continue
}
// 处理当前rpc
go jsonrpc.ServeConn(conn)
}
}
client
func main() {
// 建立tcp连接
conn, err := net.Dial("tcp", ":1234")
if err != nil {
panic(err)
}
client := jsonrpc.NewClient(conn)
var result float64
err = client.Call("DemoService.Div", rpcdemo.Args{10, 3}, &result)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
err = client.Call("DemoService.Div", rpcdemo.Args{10, 0}, &result)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}