如果咱们想在服务端为客户端提供一个打印一个输出字段的服务,借助net/rpc,咱们能够这样实现:
服务端
package mainimport ( "log" "net" "net/rpc")//结构一个类 名字是HelloServicetype 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 mainimport ( "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-...