函数如下:
func Message(worker_ID int, message string, args *Args , reply *int) chan bool {
}
这个函数驻留在主机上,当客户端想要向主机发送消息时调用它,主机位于不同的地方,所以发送消息需要IP和端口,对吧?哪种机制对 net.dial()
或 gob
或 rpc
有用?
最佳答案
如果您想要简单的东西,请查看 net/rpc它将 gob 和网络包装到远程过程调用框架中,该框架应该可以执行您想要的操作。
服务器
来自文档,通过 HTTP 运行的服务器
type Args struct {
A, B int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
log.Fatal("listen error:", e)
}
go http.Serve(l, nil)
客户端
此时,客户端可以看到服务“Arith”,其方法为“Arith.Multiply”。要调用其中一个,请调用服务器然后调用电话。您还可以进行异步调用,结果会返回到 channel 中。
client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
if err != nil {
log.Fatal("dialing:", err)
}
args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)
该框架的一个轻微奇怪之处是每个远程调用只能有一个输入参数和一个输出参数,这意味着您需要将所有参数包装在一个struct
中。
关于go - 向一组主机发送带有确认的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180097/