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

我采用并改编了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)

}

}



呼啦一阵风
浏览 247回答 1
1回答

一只斗牛犬

我认为您在 rpc.Register(chat) 之后缺少 rpc.HandleHTTP()。尝试将您的代码更改为...rpc.Register(chat)rpc.HandleHTTP()...它以这种方式对我有用,我得到了2014/03/20 18:31:21 Server:  localhost:552092014/03/20 18:31:21 Client connecting to localhost:552092014/03/20 18:31:21 Msg: returned 11而你不需要go rpc.Accept(l). 至少对我来说,它在没有这条线的情况下工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go