前面两篇文章,数据传输都是用的gob编码,这次我们以json来举例.
服务端代码 :
package main import ( "net/rpc" "net" "log" "net/rpc/jsonrpc" ) //自己的数据类 type MyMath struct{ } //加法--只能两个参数 func (mm *MyMath) Add(num map[string]int,reply *int) error { *reply = num["num1"] + num["num2"] return nil } //减法--只能两个参数 func (mm *MyMath) Sub(num map[string]int,reply *int) error { *reply = num["num1"] - num["num2"] return nil } func main() { //注册MyMath类,以代客户端调用 rpc.Register(new(MyMath)) listener, err := net.Listen("tcp", ":1215") if err != nil { log.Fatal("listen error:", err) } for { conn, err := listener.Accept() if err != nil { continue } //新协程来处理--json go jsonrpc.ServeConn(conn) } }
客户端代码:
package main import ( "fmt" "log" "net/rpc/jsonrpc" ) func main() { //连接服务--json client, err := jsonrpc.Dial("tcp", "127.0.0.1:1215") if err != nil { log.Fatal("dialing:", err) } var reply int var num = make(map[string]int) num["num1"] = 3 num["num2"] = 2 //调用远程MyMath的Add方法,也只能是三个参数 err = client.Call("MyMath.Add",num,&reply) if err != nil { log.Fatal("arith error:", err) } //输出结果 fmt.Println(reply) //调用远程MyMath的Sub方法,也只能是三个参数 err = client.Call("MyMath.Sub",num,&reply) if err != nil { log.Fatal("arith error:", err) } //输出结果 fmt.Println(reply) client.Close() }
这样,我们基本对go语言http,tcp,json三个协议的rpc服务有了一个基本的了解.