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 }