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  }