golang——net/rpc/jsonrpc包学习
1、jsonrpc包
该实现了JSON-RPC的ClientCodec和ServerCodec接口,可用于rpc包。
可用于跨语言使用go rpc服务。
2、常用方法
(1)func Dial(network, address string) (*rpc.Client, error)
Dial在指定的网络和地址连接一个JSON-RPC服务端。
(2)func NewClient(conn io.ReadWriteCloser) *rpc.Client
NewClient返回一个新的rpc.Client,以管理对连接另一端的服务的请求。
(3)func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
NewClientCodec返回一个在连接上使用JSON-RPC的rpc.ClientCodec。
(4)func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
NewServerCodec返回一个在连接上使用JSON-RPC的rpc. ServerCodec。
(5)func ServeConn(conn io.ReadWriteCloser)
ServeConn在单个连接上执行DefaultServer。
ServeConn会阻塞,服务该连接直到客户端挂起。
调用者一般应另开线程调用本函数:"go serveConn(conn)"。
ServeConn在该连接使用JSON编解码格式。
3、代码示例
package main
import (
"errors"
"fmt"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
// Args 参数
type Args struct {
A, B int
}
// Quotient 商、余数
type Quotient struct {
Quo, Rem int
}
// Arith 算术服务
type Arith int
// Multiply 乘法服务
func (*Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
// Divide 除法服务
func (*Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("除数不能为零")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
// 错误检查
func checkErr(err error) {
if err != nil {
log.Fatalln(err)
}
}
func main() {
//注册服务
err := rpc.Register(new(Arith))
checkErr(err)
//设置监听
lis, err := net.Listen("tcp", "127.0.0.1:1234")
checkErr(err)
//服务端等待请求
go func(lis net.Listener) {
for {
conn, err := lis.Accept()
if err != nil {
continue
}
// 并发处理客户端请求
go func(conn net.Conn) {
jsonrpc.ServeConn(conn)
}(conn)
}
}(lis)
//客户端请求服务
client, err := jsonrpc.Dial("tcp", ":1234")
checkErr(err)
defer client.Close()
//乘法
args := &Args{A: 17, B: 3}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
checkErr(err)
fmt.Printf("Arith.Multiply:%d * %d = %d\n", args.A, args.B, reply)
//除法
quotient := new(Quotient)
call := client.Go("Arith.Divide", args, quotient, nil)
<-call.Done
fmt.Printf("Arith.Divide:%d / %d = %d .... %d\n", args.A, args.B, quotient.Quo, quotient.Rem)
}
//输出
// Arith.Multiply:17 * 3 = 51
// Arith.Divide:17 / 3 = 5 .... 2

浙公网安备 33010602011771号