猿问

高浪 rpc 得到错误的结构变量

  1. 我在端口号 8000 和 8100 上注册了两个 RPC 服务,它们分别是服务器 1 和服务器 2。

  2. 然后,我在服务器 1 端创建了一个 RPC 连接,连接的目标是服务器 2。

  3. 成功建立连接后,我调用连接以进行远程调用。

  4. 远程呼叫成功,但是当我获得远程呼叫的被叫方的端口号时,有时我会得到 server1 的端口号,有时会得到 server2 的端口号。在我的理解中,远程调用的被叫方是serve2,程序应该返回server2的端口号。

  5. 这是什么原因造成的?

我的代码:

package main


import (

    "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)

    }


拉风的咖菲猫
浏览 54回答 1
1回答

守着星空守着你

您正在拨打两次电话:rpc.Register(rs)向代码添加错误检查:&nbsp; &nbsp; err := rpc.Register(rs)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Println(err)&nbsp; &nbsp; }你会知道的:rpc: service already defined: RPCServer由于您在此处运行两个戈鲁丁:for i := 0; i < 2; i++ {&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; go servers[i].server(&wg)}然后,他们俩都将使用以下命令注册一个 rpc 服务器:rpc.Register(rs)因此,其中之一是偶然的真实注册服务器。由于运行戈鲁廷的时间未知,因此每次运行都会有所不同只需注册一台服务器即可。例如:&nbsp; &nbsp; go servers[1].server(&wg)代码审查说明:rs.clients[port] = *client包含和:sync.Mutex首次使用后不得复制互斥体。
随时随地看视频慕课网APP

相关分类

Go
我要回答