server端代码
package main import ( "math" "net" "net/http" "net/rpc" ) //math calculate type MathUtil struct { } //该方法对外暴露,提供计算圆形面积的服务 func (mu *MathUtil)CalculateCircleArea(req float32,resp *float32)error{ *resp = math.Pi * req * req //计算圆形面积 s= pi * r * r return nil } func main(){ //1.初始化指针数据类型 mathUtil := new(MathUtil) //2.调用net/rpc包的功能 将服务对象进行注册 err := rpc.Register(mathUtil) //如果想自定义服务名,可以使用rpc.RegisterName("MathUtil",mathUtil) if err != nil { panic(err.Error()) } //3.通过该函数把mathUtil中提供的服务注册到http协议上,方便调用者可以利用http的方式进行数据传递 rpc.HandleHTTP() //4.在特定的端口进行监听 listen,err := net.Listen("tcp",":8081") if err!=nil { panic(err.Error()) } http.Serve(listen,nil) }
client端实现
package main import ( "fmt" "net/rpc" ) func main(){ client,err := rpc.DialHTTP("tcp","localhost:8081") if err != nil { panic(err.Error()) } var req float32 //如果req参数为多个参数,可以自定义结构体,对参数进行封装 req = 3 var resp *float32 //同步的方式进行调用 err = client.Call("MathUtil.CalculateCircleArea",req,&resp) if err != nil { panic(err.Error()) } fmt.Println(*resp) //异步调用 var respSync *float32 syncCall := client.Go("MathUtil.CalculateCircleArea",req,&respSync,nil) replayDone := <-syncCall.Done //读取channel中的数据,感知异步调用的返回结果,没有结果一直阻塞 fmt.Println(replayDone) fmt.Println(*respSync) }
来源:https://www.cnblogs.com/tomtellyou/p/12283774.html