青春有我
如果您使用任何标准库方法创建新客户端: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=1Client.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. }()}然后在每个连接进入时对其进行处理,并在完成处理后将其删除。