亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

高浪 rpc 得到錯誤的結構變量

高浪 rpc 得到錯誤的結構變量

Go
拉風的咖菲貓 2022-09-12 16:54:39
我在端口號 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


首次使用后不得復制互斥體。


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 70 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號