gpt4 book ai didi

go - Go中的简单RPC调用

转载 作者:IT王子 更新时间:2023-10-29 01:37:11 24 4
gpt4 key购买 nike

我正在尝试使用 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)

}

客户端.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,大约一秒后打印出“wooh server is ok”
  • 我在客户端输入内容并按 Enter 键
  • 要么没有任何反应,要么在客户端打印“rpc: client protocol error: unexpected EOF”
  • 如果什么都没发生,终止服务器(即按 Control-C)会使客户端打印上面的错误

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

这是在类里面完成的,作为在进行更严肃的练习之前熟悉 Go 中的 RPC 的初步步骤;所有其他学生都设法让这一步工作,查看这段代码,看不出与他们的有什么不同。

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

最佳答案

正如我在 mailing list response 中指出的那样,您将需要使用 DialHTTP如果你想连接到你使用 HandleHTTP 服务过的 RPC 服务器.

我已经在邮件列表上对您的代码做了一些其他说明(包括样式:根据 Effective Go 使用 gofmt 和 MixedCaps,并确保在出现错误时避免出现错误)。

关于go - Go中的简单RPC调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com