共计 1048 个字符,预计需要花费 3 分钟才能阅读完成。
如果咱们想在服务端为客户端提供一个打印一个输出字段的服务,借助 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-…
正文完