我采用并调整了Golang RPC中的示例来创建一个简单的RPC服务器,作为我想要实现的真正任务的测试运行。但无论我尝试过什么,我最终都会得到客户
2014/03/21 13:28:41 dialing: dial-http tcp MYPC:61740: unexpected HTTP response: 404 Not Found
我已尝试将MYPC:0
,127.0.0.1:61470
,MYPC:61470
以及该主题的其他变体用于服务器。也尝试了本地和两台不同的计算机(注意我在Windows上使用Go 1.2)。通常使用Go我发现它可以直接调试,但是即使阅读rpc pacakge的源代码也没有帮助 - 但是我确实发现了:0提供了一个可用的端口。
只需运行exe即可运行服务器,客户端可以通过服务器chat -c -server=127.0.0.1:8082
的端口输出运行。
以下代码实际上有什么问题?
package main
import (
"flag"
"log"
"net"
"net/http"
"net/rpc"
)
type Chat string
func (t *Chat) Msg(msg string, bytes *int) error {
*bytes = len(msg)
return nil
}
func main() {
server := flag.String("server", "", "Server and port")
client := flag.Bool("c", false, "Make me a client")
flag.Parse()
log.Println("Server: ", *server)
if !(*client) {
chat := new(Chat)
rpc.Register(chat)
l, e := net.Listen("tcp", *server)
if e != nil {
log.Fatal("listen error:", e)
}
log.Println(l.Addr().String())
go rpc.Accept(l)
http.Serve(l, nil)
} else {
log.Println("Client connecting to", *server)
// !! The error occurs here
client, err := rpc.DialHTTP("tcp", *server)
if err != nil {
log.Fatal("dialing: ", err)
}
var reply int
err = client.Call("Chat.Msg", "Make it so!", &reply)
if err != nil {
log.Fatal("chat error:", err)
}
log.Println("Msg: returned", reply)
}
}
答案 0 :(得分:2)
我认为你在rpc.Register(聊天)之后缺少rpc.HandleHTTP()。尝试将代码更改为
...
rpc.Register(chat)
rpc.HandleHTTP()
...
这对我有用,我得到了
2014/03/20 18:31:21 Server: localhost:55209
2014/03/20 18:31:21 Client connecting to localhost:55209
2014/03/20 18:31:21 Msg: returned 11
而且你不需要go rpc.Accept(l)
。至少对我而言,它没有这条线。