github.com/micro/go-micro/examples@v0.0.0-20210105173217-bf4ab679e18b/stream/client/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 "context" 8 proto "github.com/micro/go-micro/examples/stream/server/proto" 9 "github.com/micro/go-micro/v2" 10 ) 11 12 func bidirectional(cl proto.StreamerService) { 13 // create streaming client 14 stream, err := cl.Stream(context.Background()) 15 if err != nil { 16 fmt.Println("err:", err) 17 return 18 } 19 20 // bidirectional stream 21 // send and receive messages for a 10 count 22 for j := 0; j < 10; j++ { 23 if err := stream.Send(&proto.Request{Count: int64(j)}); err != nil { 24 fmt.Println("err:", err) 25 return 26 } 27 rsp, err := stream.Recv() 28 if err != nil { 29 fmt.Println("recv err", err) 30 break 31 } 32 fmt.Printf("Sent msg %v got msg %v\n", j, rsp.Count) 33 } 34 35 // close the stream 36 if err := stream.Close(); err != nil { 37 fmt.Println("stream close err:", err) 38 } 39 } 40 41 func serverStream(cl proto.StreamerService) { 42 // send request to stream count of 10 43 stream, err := cl.ServerStream(context.Background(), &proto.Request{Count: int64(10)}) 44 if err != nil { 45 fmt.Println("err:", err) 46 return 47 } 48 49 var i int 50 51 // server side stream 52 // receive messages for a 10 count 53 for { 54 rsp, err := stream.Recv() 55 if err != nil { 56 fmt.Println("recv err", err) 57 break 58 } 59 i++ 60 fmt.Printf("got msg %v\n", rsp.Count) 61 } 62 63 if i < 10 { 64 fmt.Println("only got", i) 65 return 66 } 67 68 // close the stream 69 if err := stream.Close(); err != nil { 70 fmt.Println("stream close err:", err) 71 } 72 } 73 74 func main() { 75 service := micro.NewService() 76 service.Init() 77 78 // create client 79 cl := proto.NewStreamerService("go.micro.srv.stream", service.Client()) 80 81 for { 82 fmt.Println("Stream") 83 // bidirectional stream 84 bidirectional(cl) 85 86 fmt.Println("ServerStream") 87 // server side stream 88 serverStream(cl) 89 90 time.Sleep(time.Second) 91 } 92 }