我正在尝试使用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应该回复所发送的任何内容,请求的时间和散列。
这就是现在正在发生的事情:
在任何一种情况下,服务器端都不会显示“Woooh imma deliverin stuff”......
这是在课堂上完成的,作为熟悉RPC in Go的初步步骤,然后再进行更严肃的练习;所有其他学生都设法让这一步工作,看了这段代码,看不出他们的差异。
有人看到这段代码有什么问题吗?
答案 0 :(得分:4)
正如我在mailing list response中所述,如果要连接到使用DialHTTP提供服务的RPC服务器,则需要使用HandleHTTP。
我已经在邮件列表上做了一些关于你的代码的其他注释(包括样式:使用gofmt和MixedCaps,每Effective Go,并确保挽救错误)。