service/method 请求格式错误

service/method request ill-formed

我是 RPC 的新手,我似乎无法弄清楚是什么导致我的客户恐慌:

2020/01/04 14:34:29 rpc: service/method request ill-formed: API:Greeting

这是我的客户的样子:

main.go

func main() {
    serverAddress := "localhost"
    serverPort := "4040"

    client, err := rpc.DialHTTP("tcp", serverAddress+":"+serverPort)
    if err != nil{
        log.Fatal(err)
    }

    fmt.Println("start")
    var results string

    a := "www.google.com"
    err = client.Call("API:Greeting", a, &results)

    if err != nil{
        log.Fatal(err)
    }

    fmt.Println(results)
    fmt.Println("end")
}

这是我的服务器的样子(在不同的项目上):

main.go

package main
import (
    "fmt"
    "log"
    "net"
    "net/http"
    "net/rpc"
)

type API int

func (api *API) Greeting(empty string, result *string) error {
    fmt.Println("called Greeting")
    *result = "Hello"
    fmt.Println("returning Greeting")
    return nil
}

func main() {
    serverPort := "8080"
    api := new(API)
    err := rpc.Register(api)
    if err != nil {
        log.Fatal("error registering API", err)
    }

    rpc.HandleHTTP()

    listener, err := net.Listen("tcp", ":"+serverPort)

    if err != nil {
        log.Fatal("Listener error", err)
    }
    log.Printf("serving rpc on port %s", serverPort)
    err = http.Serve(listener, nil)

    if err != nil {
        log.Fatal("error serving: ", err)
    }
}

如果有人能指出我做错了什么,那就太好了。

我相信你必须像这样调用远程过程:

client.Call("API.Greeting", a, &results)

注意 Object.Method 符号,而不是 Object:Method