为了账号安全,请及时绑定邮箱和手机立即绑定

保持 Golang net/rpc 的连接

保持 Golang net/rpc 的连接

Go
明月笑刀无情 2022-10-17 19:23:56
据我了解,在这里阅读 net/rpc 包文档 https://pkg.go.dev/net/rpc@go1.17.5每次客户端对服务器进行 rpc 调用时,都会建立一个新连接。如何实现每个新客户端打开一个新连接、保持其活动状态并仅使用 TPC(即不使用 HTTP)调用 RPC 方法?
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

如果您使用任何标准库方法创建新客户端:


client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")

if err != nil {

    log.Fatal("dialing:", err)

}

在引擎盖下,它将调用net.Dial,从而产生与以下相关联的单个连接rpc.Client:


conn, err := net.Dial(network, address)

您可以看到 NewClient 在此处实例化时采用单个连接:https ://cs.opensource.google/go/go/+/refs/tags/go1.17.5:src/net/rpc/client.go;l=193 -197;drc=refs%2Ftags%2Fgo1.17.5;bpv=1;bpt=1


Client.Call对该客户端的任何调用都将写入和读取该底层连接,而不会产生新连接。


因此,只要您一次实例化您的客户端,然后对同一客户端进行所有 rpc 调用,您将始终使用单个连接。如果该连接被切断,客户端将不再可用。


rpc.Client也是线程安全的,因此您可以安全地创建它并在所有地方使用它,而无需建立新的连接。


回答你的评论。如果你想运行一个 rpc 服务器并跟踪连接,你可以这样做:


l, e := net.Listen("tcp", ":1234")

if e != nil {

    log.Fatal("listen error:", e)

}

server := rpc.NewServer()

for {

    conn, err := l.Accept()

    if err != nil {

        panic(err) // replace with log message?

    }

    // Do something with `conn`

    go func() {

        server.ServeConn(conn)

        // The server has stopped serving this connection, you can remove it.

    }()

}

然后在每个连接进入时对其进行处理,并在完成处理后将其删除。


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信