我的客户端连接时,简单的RPC服务器无法应答

时间:2014-03-21 00:38:23

标签: go rpc

我采用并调整了Golang RPC中的示例来创建一个简单的RPC服务器,作为我想要实现的真正任务的测试运行。但无论我尝试过什么,我最终都会得到客户

2014/03/21 13:28:41 dialing: dial-http tcp MYPC:61740: unexpected HTTP response: 404 Not Found

我已尝试将MYPC:0127.0.0.1:61470MYPC: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)
}
}

1 个答案:

答案 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)。至少对我而言,它没有这条线。