如果我们想在服务端为客户端提供一个打印一个输入字段的服务,借助net/rpc,我们可以这样实现:
服务端
package main
import (
"log"
"net"
"net/rpc"
)
//构造一个类 名字是HelloService
type HelloService struct{}
//给这个类绑定一个Hello方法 实现打印的功能,这个方法只能有两个可序列化的参数,其中第二个参数是指针类型,并且返回一个error类型,同时必须是公开的方法
func (item *HelloService) Hello(req string, reply *string) error {
*reply = "server-hello " + req
return nil
}
func main() {
//将HelloService的对象注册为一个RPC服务
rpc.RegisterName("HelloService", new(HelloService))
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
//建立一个唯一的TCP链接,并且通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务。
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
rpc.ServeConn(conn)
}
客户端
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
//通过rpc.Dial拨号RPC服务
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing", err)
}
var reply string
//通过client.Call调用具体的RPC方法
//在调用client.Call时,第一个参数是用点号链接的RPC服务名字和方法名字,
//第二和第三个参数分别我们定义RPC方法的两个参数。
err = client.Call("HelloService.Hello", " client-Hello", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}
运行结果:
server-hello client-Hello
参考: https://chai2010.cn/advanced-...