我在端口號 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
由于您在此處運行兩個戈魯?。?/p>
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 關注
- 70 瀏覽
添加回答
舉報
0/150
提交
取消