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.
}()
}
然后在每个连接进入时对其进行处理,并在完成处理后将其删除。
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报