gpt4 book ai didi

Go:rpc 请求返回空

转载 作者:IT王子 更新时间:2023-10-29 02:15:42 28 4
gpt4 key购买 nike

好的,我有一个 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))
}

服务器/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
}

客户端.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())
}
}

客户端/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
}

最佳答案

错误在server/domain.go

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

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

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

关于Go:rpc 请求返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32228143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com