我采用并改編了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 mainimport ("flag""log""net""net/http""net/rpc")type Chat stringfunc (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)}}
1 回答

一只斗牛犬
TA貢獻1784條經驗 獲得超2個贊
我認為您在 rpc.Register(chat) 之后缺少 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). 至少對我來說,它在沒有這條線的情況下工作。
- 1 回答
- 0 關注
- 275 瀏覽
添加回答
舉報
0/150
提交
取消