关于go:Golang-RPC-一Go标准库的简单实现-介绍使用

如果咱们想在服务端为客户端提供一个打印一个输出字段的服务,借助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-…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理