/
server.go
122 lines (111 loc) · 2.64 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"io"
"log"
"math/rand"
"net"
"os"
"os/signal"
"strings"
"time"
pb "github.com/Amanpradhan/Stream-go/src/proto"
"google.golang.org/grpc"
)
type server struct {
pb.UnimplementedAgentServer
}
const (
interval_time = 2 * time.Second
)
func generateString() string {
// generate random strings of 2 word from list of words
var dummy = []string{"hello", "sun", "world", "space", "moon", "crypto", "sky", "ocean", "universe", "human"}
rnd1 := int32(rand.Intn(len(dummy)))
rnd2 := int32(rand.Intn(len(dummy)))
return dummy[rnd1] + " " + dummy[rnd2]
}
func greet() string {
t := time.Now()
var st string
switch {
case t.Hour() < 12:
st = "Good morning!"
case t.Hour() < 17:
st = "Good afternoon!"
case t.Hour() < 19:
st = "Good evening!"
default:
st = "Good night!"
}
return st
}
func (s server) Communicate(srv pb.Agent_CommunicateServer) error {
log.Println("starting new server")
ctx := srv.Context()
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
req, err := srv.Recv()
if err == io.EOF {
log.Println("exit")
return nil
}
if err != nil {
log.Printf("got error %v", err)
continue
}
recvStr := req.Message
if strings.Contains(recvStr, "hello") {
log.Println(recvStr)
}
ticker := time.NewTicker(interval_time)
quit := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
greetRes := pb.Response{Result: greet()}
if err := srv.Send(&greetRes); err != nil {
log.Fatalf("got error %v", err)
}
// uncomment below line to see all messages sent by server to client
//fmt.Printf("message sent successfully %s to client\n", greetRes.Result)
case <-quit:
ticker.Stop()
return
}
}
}()
<-time.After(time.Duration(interval_time))
// generating random string below
resp := pb.Response{Result: generateString()}
if err := srv.Send(&resp); err != nil {
log.Fatalf("got error %v", err)
}
// uncomment below line to see all messages sent by server to client
//fmt.Printf("message sent successfully %s to client\n", resp.Result)
}
}
func main() {
// create a listener
lis, err := net.Listen("tcp", ":50005")
if err != nil {
log.Fatalf("got error while trrying to listen: %v", err)
}
// create a grpc server
s := grpc.NewServer()
pb.RegisterAgentServer(s, &server{})
// start the server...
if err := s.Serve(lis); err != nil {
log.Fatalf("got error while starting the server: %v", err)
}
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
sig := <-quit
log.Printf("Abrupt Server Shut Down. Reason: %v", sig)
s.GracefulStop()
log.Println("Server Stopped Gracefully")
}