server端:
package main
import(
"fmt"
"net"
"net/rpc" //rpc包
)
// 定义rpc请求
type AddRequest struct{
Left int
Right int
}
//定义rpc响应
type AddResponse Struct{
Result int
}
type Calc struct{}
// rpc的函数格式:
// 参数1:请求对象(可以是指针/值)
// 参数2:响应对象(可以是指针)
// 返回值:error
func (c *Calc) Add(req AddRequest,resp *AddResponse)error{
fmt.Println("calc.add")
resp.Result=req.Left + req.Right
return nil
}
type AAA struct {}
func(a *AAA)Add(req AddRequest,resp *AddResponse)error{
fmt.Println("add.Add")
return nil
}
func main(){
rpc.Register(&Calc{}) //注册
rpc.Register("AAAA",&Calc{}) //类似于别名,可以使用AAAA来调用Calc方法,用于解决结构体名称相同等问题
listener,_:=net.Listen("tcp","0.0.0.0:8888")
for {
conn,err:=listener.Accept()
if err !=nil{
break
}
jsonrpc.Serveconn(conn) //类似http服务端
}
listener.Close()
}
client端
package main
import(
"fmt"
"net"
"net/rpc" //rpc包
)
// 定义rpc请求
type AddRequest struct{
Left int
Right int
}
//定义rpc响应
type AddResponse Struct{
Result int
}
func main(){
client,_:=jsonrpc.Dial("tcp","127.0.0.1:8888")
req:=AddRequest{1,100}
resp:=AddResponse{}
err:=client.Call("Calc.Add",req,&resp) //Call方法会阻塞(同步方式),可以使用Go方法(异步方式)
/*
call :=client.Go("AAAA.Add",req,&resp,nil) //使用异步方式去rpc调用,返回一个结构体,Done为一个管道类型的返回数据,所以下面用select,超时机制。
for {
select {
case result:=<-call.Done:
fmt.Println(result.Reply,result.Error)
default:
fmt.Println(time.Now())
time.Sleep(2 * time.Second)
}
}
*/
fmt.Println(err,resp)
}
文档更新时间: 2021-09-15 17:09 作者:张尚