package main import ( "context" "log" "net" "net/http" "sync" "krwu.top/krpc.v1" ) func startServer(addr chan string) { var foo Foo if err := krpc.Register(&foo); err != nil { log.Fatal("register error: ", err) } krpc.HandleHTTP() // pick a free port l, err := net.Listen("tcp", ":0") if err != nil { log.Fatal("network error:", err) } log.Println("start rpc server on", l.Addr()) addr <- l.Addr().String() _ = http.Serve(l, nil) //krpc.Accept(l) } func main() { log.SetFlags(0) addr := make(chan string) go startServer(addr) cli, _ := krpc.DialHTTP("tcp", <-addr) defer func() { _ = cli.Close() }() // send options var wg sync.WaitGroup // send request & receive response for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() args := &Args{Num1: i, Num2: i * i} var reply int if err := cli.Call(context.TODO(), "Foo.Sum", args, &reply); err != nil { log.Fatal("call Foo.Sum error: ", err) } log.Printf("%d + %d = %d\n", args.Num1, args.Num2, reply) }(i) } wg.Wait() }