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 }