1package server 2 3import ( 4 "fmt" 5 "io" 6 "math/rand" 7 "strings" 8 "time" 9 10 "github.com/ktr0731/grpc-test/api" 11 "google.golang.org/grpc/metadata" 12) 13 14func init() { 15 rand.Seed(time.Now().UnixNano()) 16} 17 18func (s *ExampleService) ClientStreaming(stm api.Example_ClientStreamingServer) error { 19 var t int 20 var names []string 21 stm.SendHeader(metadata.New(map[string]string{"header_key1": "header_val1", "header_key2": "header_val2"})) 22 stm.SetTrailer(metadata.New(map[string]string{"trailer_key1": "trailer_val1", "trailer_key2": "trailer_val2"})) 23 for { 24 req, err := stm.Recv() 25 if err == io.EOF { 26 s.Logger.Println("end of client streaming") 27 return stm.SendAndClose(&api.SimpleResponse{ 28 Message: fmt.Sprintf(`you sent requests %d times (%s).`, t, strings.Join(names, ", ")), 29 }) 30 } 31 if err != nil { 32 return err 33 } 34 names = append(names, req.GetName()) 35 t++ 36 s.Logger.Println("client streaming request received") 37 } 38 return nil 39} 40 41func (s *ExampleService) ServerStreaming(req *api.SimpleRequest, stm api.Example_ServerStreamingServer) error { 42 defer s.Logger.Println("end of server streaming") 43 if err := stm.SendHeader(metadata.New(map[string]string{"ss_header_key1": "header_val1", "ss_header_key2": "header_val2"})); err != nil { 44 return err 45 } 46 stm.SetTrailer(metadata.New(map[string]string{"ss_trailer_key1": "trailer_val1", "ss_trailer_key2": "trailer_val2"})) 47 if err := s.serverStreaming(req, stm); err != nil { 48 return err 49 } 50 return nil 51} 52 53func (s *ExampleService) serverStreaming(req *api.SimpleRequest, stm api.Example_ServerStreamingServer) error { 54 n := 3 55 s.Logger.Printf("send %d times\n", n) 56 for i := 0; i < n; i++ { 57 s.Logger.Printf("send %d\n", i+1) 58 err := stm.Send(&api.SimpleResponse{ 59 Message: fmt.Sprintf(`hello %s, I greet %d times.`, req.GetName(), i+1), 60 }) 61 if err != nil { 62 return err 63 } 64 time.Sleep(50 * time.Millisecond) 65 } 66 return nil 67} 68 69func (s *ExampleService) BidiStreaming(stm api.Example_BidiStreamingServer) error { 70 if err := stm.SendHeader(metadata.New(map[string]string{"header_key1": "header_val1", "header_key2": "header_val2"})); err != nil { 71 return err 72 } 73 stm.SetTrailer(metadata.New(map[string]string{"trailer_key1": "trailer_val1", "trailer_key2": "trailer_val2"})) 74 for { 75 req, err := stm.Recv() 76 if err == io.EOF { 77 return nil 78 } 79 if err != nil { 80 return err 81 } 82 83 if err := s.serverStreaming(req, stm); err != nil { 84 return err 85 } 86 } 87} 88