【问题标题】:Go: rpc request returns emptyGo:rpc 请求返回空
【发布时间】:2015-11-20 13:58:57
【问题描述】:

好的,我有一个 rpc 服务器包和一个 rpc 客户端包。 我想要求服务器返回所有域。

在 server.go 中,我导入 server.DomainServer 并通过 http 提供服务。

在 client.go 中,我导入 client.DomainClient 并向侦听服务器发送 rpc 调用。

回复为空[]

预期的回复是["dom1.de","dom2.de"]

为什么响应是空的?我该如何调试?

我是否必须共享 GetAllDomainsRequest 和 GetAllDomainsRequest 结构,以便它们具有相同的类型,例如在一个名为 common 的包中?

更新:运行 wireshark 来捕获响应,响应是 []string

server.go

package main

import (
    "log"
    "net/http"
    "net/rpc"

    "bitbucket.org/idalu/hostd/server"
)

func main() {
    var authkey = "123"
    ds := &server.DomainServer{
        Authkey: authkey,
    }

    rpc.Register(ds)
    rpc.HandleHTTP()
    log.Fatalln(http.ListenAndServe(":1312", nil))
}

server/domain.go

package server

import (
    "errors"
    "fmt"
)

type DomainServer struct {
    Authkey string
}

type GetAllDomainsRequest struct {
    Authkey string
}

type GetAllDomainsResponse struct {
    Domains []string
}

func (s *DomainServer) GetAllDomains(req GetAllDomainsRequest, rsp *GetAllDomainsResponse) error {
    if req.Authkey != s.Authkey {
        return errors.New("forbidden")
    }
    rsp = &GetAllDomainsResponse{
        Domains: []string{"dom1.de", "dom2.de"},
    }
    fmt.Println(rsp)
    return nil
}

client.go

package main

import (
    "log"

    "bitbucket.org/idalu/hostd/client"
)

func main() {
    dc := &client.DomainClient{
        Authkey:    "123",
        ServerAddr: "127.0.0.1:1312",
    }
    if e := dc.GetAllDomains(); e != nil {
        log.Fatalln(e.Error())
    }
}

client/domain.go

package client

import (
    "fmt"
    "net/rpc"
)

type DomainClient struct {
    ServerAddr string
    Authkey    string
}

type GetAllDomainsRequest struct {
    Authkey string
}

type GetAllDomainsResponse struct {
    Domains []string
}

func (c *DomainClient) GetAllDomains() error {
    client, e := rpc.DialHTTP("tcp", c.ServerAddr)
    if e != nil {
        return e
    }
    req := GetAllDomainsRequest{
        Authkey: c.Authkey,
    }
    rsp := GetAllDomainsResponse{}
    if e := client.Call("DomainServer.GetAllDomains", req, &rsp); e != nil {
        return e
    }
    fmt.Println(rsp.Domains)
    return nil
}

【问题讨论】:

    标签: go rpc


    【解决方案1】:

    错误在 server/domain.go 中

    rsp = &GetAllDomainsResponse{
        Domains: []string{"dom1.de", "dom2.de"},
    }
    

    您没有更新调用期间提供的响应值,而是为您的局部变量分配一个新值。应该是这样的

    rsp.Domains = []string{"dom1.de", "dom2.de"}
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多