为了账号安全,请及时绑定邮箱和手机立即绑定

高浪 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

由于您在此处运行两个戈鲁丁:


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 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信