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
。
我是 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
。