我在端口号 8000 和 8100 上注册了两个 RPC 服务,它们分别是服务器 1 和服务器 2。然后,我在服务器 1 端创建了一个 RPC 连接,连接的目标是服务器 2。成功建立连接后,我调用连接以进行远程调用。远程呼叫成功,但是当我获得远程呼叫的被叫方的端口号时,有时我会得到 server1 的端口号,有时会得到 server2 的端口号。在我的理解中,远程调用的被叫方是serve2,程序应该返回server2的端口号。这是什么原因造成的?我的代码:package mainimport ( "log" "net" "net/rpc" "sync")type RPCServer struct { port string clients map[string]rpc.Client}type MessageArgs struct { Sender string Message string}type MessageReply struct { Receive bool}func (rs *RPCServer) SendMessage(args *MessageArgs, reply *MessageReply) error { log.Printf("current rpc server [%s] Receive Message [%s] from Sender[%s]", rs.port, args.Message, args.Sender) reply.Receive = true return nil}func (rs *RPCServer) server(wg *sync.WaitGroup) { l, e := net.Listen("tcp", rs.port) if e != nil { log.Fatal("listen error: ", e) } else { log.Printf("server start successfully on port %s\n", rs.port) } rpc.Register(rs) // wait for all server construct but not wait for loop wg.Done() for { conn, err := l.Accept() if err != nil { log.Fatal("accept error: ", err) } go rpc.ServeConn(conn) }}func (rs *RPCServer) connect(port string) { client, err := rpc.Dial("tcp", port) if err != nil { log.Fatal("dialing: ", err) } else { log.Printf("[%s] server connect other server [%s] successfully.\n", rs.port, port) } rs.clients[port] = *client}func main() { servers := make([]RPCServer, 2) ports := [2]string{":8000", ":8100"} for i := range servers { servers[i].clients = make(map[string]rpc.Client) servers[i].port = ports[i] } // start all rpc server var wg sync.WaitGroup for i := 0; i < 2; i++ { wg.Add(1) go servers[i].server(&wg) }
1 回答
守着星空守着你
TA贡献1799条经验 获得超8个赞
您正在拨打两次电话:rpc.Register(rs)
向代码添加错误检查:
err := rpc.Register(rs)
if err != nil {
log.Println(err)
}
你会知道的:
rpc: service already defined: RPCServer
由于您在此处运行两个戈鲁丁:
for i := 0; i < 2; i++ {
wg.Add(1)
go servers[i].server(&wg)
}
然后,他们俩都将使用以下命令注册一个 rpc 服务器:
rpc.Register(rs)
因此,其中之一是偶然的真实注册服务器。由于运行戈鲁廷的时间未知,因此每次运行都会有所不同
只需注册一台服务器即可。例如:
go servers[1].server(&wg)
代码审查说明:
rs.clients[port] = *client
包含和:sync.Mutex
首次使用后不得复制互斥体。
- 1 回答
- 0 关注
- 53 浏览
添加回答
举报
0/150
提交
取消