github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/jrpcfs/test/example.go (about)

     1  // Copyright (c) 2015-2021, NVIDIA CORPORATION.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package main
     5  
     6  import (
     7      "errors"
     8      "fmt"
     9      "log"
    10      "net"
    11      "net/rpc"
    12      "net/rpc/jsonrpc"
    13  )
    14  
    15  type Args struct {
    16      A, B int
    17  }
    18  
    19  type Reply struct {
    20      C int
    21  }
    22  
    23  type Arith int
    24  
    25  //type ArithAddResp struct {
    26  //    Id     interface{} `json:"id"`
    27  //    Result Reply       `json:"result"`
    28  //    Error  interface{} `json:"error"`
    29  //}
    30  
    31  func (t *Arith) Add(args *Args, reply *Reply) error {
    32      reply.C = args.A + args.B
    33      return nil
    34  }
    35  
    36  func (t *Arith) Mul(args *Args, reply *Reply) error {
    37      reply.C = args.A * args.B
    38      return nil
    39  }
    40  
    41  func (t *Arith) Div(args *Args, reply *Reply) error {
    42      if args.B == 0 {
    43          return errors.New("divide by zero")
    44      }
    45      reply.C = args.A / args.B
    46      return nil
    47  }
    48  
    49  func (t *Arith) Error(args *Args, reply *Reply) error {
    50      panic("ERROR")
    51  }
    52  
    53  func startServer() {
    54      arith := new(Arith)
    55  
    56      server := rpc.NewServer()
    57      server.Register(arith)
    58  
    59      l, e := net.Listen("tcp", ":8222")
    60      if e != nil {
    61          log.Fatal("listen error:", e)
    62      }
    63  
    64      for {
    65          conn, err := l.Accept()
    66          if err != nil {
    67              log.Fatal(err)
    68          }
    69  
    70          go server.ServeCodec(jsonrpc.NewServerCodec(conn))
    71      }
    72  }
    73  
    74  func main() {
    75  
    76      // starting server in go routine (it ends on end
    77      // of main function
    78      go startServer()
    79  
    80      // now client part connecting to RPC service
    81      // and calling methods
    82  
    83      conn, err := net.Dial("tcp", "localhost:8222")
    84  
    85      if err != nil {
    86          panic(err)
    87      }
    88      defer conn.Close()
    89  
    90      c := jsonrpc.NewClient(conn)
    91  
    92      var reply Reply
    93      var args *Args
    94      for i := 0; i < 11; i++ {
    95          // passing Args to RPC call
    96          args = &Args{7, i}
    97  
    98          // calling "Arith.Mul" on RPC server
    99          err = c.Call("Arith.Mul", args, &reply)
   100          if err != nil {
   101              log.Fatal("arith error:", err)
   102          }
   103          fmt.Printf("Arith: %d * %d = %v\n", args.A, args.B, reply.C)
   104  
   105          // calling "Arith.Add" on RPC server
   106          err = c.Call("Arith.Add", args, &reply)
   107          if err != nil {
   108              log.Fatal("arith error:", err)
   109          }
   110          fmt.Printf("Arith: %d + %d = %v\n", args.A, args.B, reply.C)
   111  
   112          // NL
   113          fmt.Printf("\033[33m%s\033[m\n", "---------------")
   114      }
   115  }