服务端代码:
package main import ( "net/rpc" "net" "log" ) //自己的数据类 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 } //新协程来处理 go rpc.ServeConn(conn) } }
客户端代码:
package main import ( "net/rpc" "net" "log" ) //自己的数据类 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 } //新协程来处理 go rpc.ServeConn(conn) } }
对比之现http协议的区别,服务端采用了TCP协议,然后需要自己控制连接,当有客户端连接上来后,我们需要把这个连接交给rpc来处理,而客户端唯一的区别一个是DialHTTP,一个是Dial(tcp),其他处理一模一样.