RPC 客户端

这节,您将看到被存为 RPCclient.go 的 RPC 客户端代码,它被分为四部分进行讲解。

RPCclient.go 的第一部分:

  1. package main
  2. import (
  3. "fmt"
  4. "net/rpc"
  5. "os"
  6. "sharedRPC"
  7. )

RPCclient.go 第二部分包含的代码如下:

  1. func main() {
  2. arguments := os.Args
  3. if len(arguments) == 1 {
  4. fmt.Println("Please provide a host:port sting!")
  5. return
  6. }
  7. CONNECT := arguments[1]
  8. c, err := rpc.Dial("tcp", CONNECT)
  9. if err != nil {
  10. fmt.Println(err)
  11. return
  12. }

注意,尽管 RPC 服务器使用 TCP,但使用 rpc.Dial() 函数代替 net.Dial() 连接 RPC 服务器。

RPCclient.go 的第三部分如下:

  1. args := sharedRPC.MyFloats(16, -0.5)
  2. var reply float64
  3. err = c.Call("MyInterface.Multiply", args, &reply)
  4. if err != nil {
  5. fmt.Println(err)
  6. return
  7. }
  8. fmt.Printf("Reply (Multiply): %f\n", reply)

RPC 客户端和 RPC 服务器之间通过 Call() 函数交换函数名,参数和函数返回结果,而 RPC 客户端对函数的具体实现一无所知。

RPCclient.go 的其余代码如下:

  1. err = c.Call("MyInterface.Power", argus, &reply)
  2. if err != nil {
  3. fmt.Println(err)
  4. return
  5. }
  6. fmt.Printf("Reply (Power): %f\n", reply)
  7. }

如果您试图在没有一个运行的 RPC 服务器的情况下执行 RPCclient.go 将会得到如下错误信息:

  1. $ go run RPCclient.go localhost:1234
  2. dial tcp [::1]:1234: connect: connection refused