سؤال

I took and adapted the example from Golang RPC to make a simple RPC server as a test run for the real task I want to acheive. But whatever I have tried I end up with the client getting

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

I have tried using MYPC:0, 127.0.0.1:61470, MYPC:61470 and other variants of that theme for the server. Also have tried locally and on two different computers (Note I am using Go 1.2 on Windows). Usually with Go I find it straight-forward to debug, but even reading the source for the rpc pacakge is not helping this time - however I did pick up the trick of :0 giving an available port.

Server can be run by just running the exe, and Client can be run with the port output by the server chat -c -server=127.0.0.1:8082.

What is actually wrong with the following code?

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)
}
}
هل كانت مفيدة؟

المحلول

I think you're missing rpc.HandleHTTP() after rpc.Register(chat). Try changing your code to

...
rpc.Register(chat)
rpc.HandleHTTP()
...

It worked for me this way, I got

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

And you don't need go rpc.Accept(l). At least for me it worked without this line.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top