为了账号安全,请及时绑定邮箱和手机立即绑定

当我的客户端连接时,简单的 RPC 服务器不会应答

当我的客户端连接时,简单的 RPC 服务器不会应答

Go
呼啦一阵风 2021-07-28 21:09:22
我采用并改编了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). 至少对我来说,它在没有这条线的情况下工作。


查看完整回答
反对 回复 2021-08-02
  • 1 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信