前面两篇文章,数据传输都是用的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服务有了一个基本的了解.
