github.com/rohankumardubey/proxyfs@v0.0.0-20210108201508-653efa9ab00e/jrpcfs/test/example.go (about)

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