Go中的简单RPC调用

时间:2013-12-04 17:12:24

标签: go rpc

我正在尝试使用Go中的RPC调用来使用最小的应用程序。正如我从代码中看到的那样,我大量借用online example

server.go:

package main

import (
    [...]
)

type InfoDumper int

func (s *InfoDumper) Dump(request string, reply *string) error {

    fmt.Println("Woooh imma deliverin stuff\n")

    current_time := time.Now()

    h:= sha1.New()
    var barray []byte
    copy(barray, request)
    hash_rq := h.Sum(barray)

    *reply = request + "\n" + current_time.Format(time.ANSIC) + "\n"  + string(hash_rq) + "\n"
    return nil
}


func main() {

    server := new(InfoDumper)

    rpc.Register(server)
    rpc.HandleHTTP()

    l, e := net.Listen("tcp", "127.0.0.1:40000")
    if e != nil {
        fmt.Println(e)
    }

    http.Serve(l, nil)

}

client.go:

package main

import (
    [...]
)

func main() {

    client, e := rpc.Dial("tcp", "127.0.0.1:40000")

    if e!=nil {
        fmt.Println(e)
    }   else {
        fmt.Println("wooh server is ok")
    }

    in:= bufio.NewReader(os.Stdin)

    for {

        line, _, _ := in.ReadLine()
        request := string(line)
        var reply string

        e = client.Call("InfoDumper.Dump", request, &reply)

        if (e!=nil) {
            fmt.Println("omg error!", e)
        }

        fmt.Println(reply)
    }

}

我能看到的唯一区别是我写了http.Serve(l, nil)而不是go http.Serve(l, nil);这是因为使用go进行写入会使我的服务器立即终止。 InfoDump应该回复所发送的任何内容,请求的时间和散列。

这就是现在正在发生的事情:

  • 我在终端
  • 中运行server.go
  • 我在另一个终端上运行client.go,大约一秒钟后“打印服务器就好了”
  • 我打字并点击客户端的Enter
  • 要么没有任何反应,要么在客户端打印“rpc:客户端协议错误:意外的EOF”
  • 如果什么也没发生,终止服务器(即点击Control-C)会使客户端打印上面的错误

在任何一种情况下,服务器端都不会显示“Woooh imma deliverin stuff”......

这是在课堂上完成的,作为熟悉RPC in Go的初步步骤,然后再进行更严肃的练习;所有其他学生都设法让这一步工作,看了这段代码,看不出他们的差异。

有人看到这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:4)

正如我在mailing list response中所述,如果要连接到使用DialHTTP提供服务的RPC服务器,则需要使用HandleHTTP

我已经在邮件列表上做了一些关于你的代码的其他注释(包括样式:使用gofmt和MixedCaps,每Effective Go,并确保挽救错误)。

相关问题