110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
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)
|
|
}
|
|
|
|
|