package services import ( "fmt" "context" "log" "time" "google.golang.org/grpc" Greeter "tldemo/services/Greeter" ) type GreeterServer struct { Greeter.UnimplementedGreeterServiceServer } func (s *GreeterServer) Hello(ctx context.Context, in *Greeter.HelloRequest) (*Greeter.HelloResponse, error) { currentTime := time.Now() replyMessage := fmt.Sprintf("Hello %s, time is %s", in.Name, currentTime.Format("15:04:05")) log.Printf("[Hello User] %s", in.Name) result := &Greeter.HelloResponse{ReplyMessage: replyMessage} return result, nil } type TimeServer struct { Greeter.UnimplementedTimeServiceServer } func (s *TimeServer) Now(ctx context.Context, in *Greeter.Nothing) (*Greeter.NowResponse, error) { currentTime := uint64(time.Now().UTC().UnixMilli()) log.Printf("[Now]send time: %d", currentTime) result := &Greeter.NowResponse{Now: currentTime} return result, nil } func (s *TimeServer) Ticktok(in *Greeter.TicktokRequest, stream Greeter.TimeService_TicktokServer) error { ctx := stream.Context() response := &Greeter.NowResponse{} sendNow := func(counts int32) { response.Now = uint64(time.Now().UTC().UnixMilli()) response.Counts = counts log.Printf("[Ticktok]send time %d/%d", response.Now, counts) if err := stream.Send(response); err != nil { return } } counts := int32(in.Counts) if(counts < 0) { counts=0 } for { sendNow(counts) if(in.Counts>0) { counts-=1 if(counts <= 0) { return nil } } select { case <-ctx.Done(): return nil default: time.Sleep(1.0 * time.Second) } } return nil } func (s *TimeServer) Watch(stream Greeter.TimeService_WatchServer) error { ctx := stream.Context() response := &Greeter.NowResponse{} sendNow := func() error { response.Now = uint64(time.Now().UTC().UnixMilli()) log.Printf("[Watch]send time %d", response.Now) return stream.Send(response) } for { select { case <-ctx.Done(): return nil default: } if _, err := stream.Recv(); err != nil { return err } else if err := sendNow(); err != nil { return err } } } func RegisterGreeterServer(s *grpc.Server) { greeterServer := &GreeterServer{} Greeter.RegisterGreeterServiceServer(s, greeterServer) timeServer := &TimeServer{} Greeter.RegisterTimeServiceServer(s, timeServer) }