-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
79 lines (70 loc) · 1.72 KB
/
main.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
package main
import (
"bufio"
"flag"
"fmt"
"os"
"github.com/charlesderek/actor-model/actor"
"github.com/charlesderek/actor-model/examples/chat/types"
"github.com/charlesderek/actor-model/log"
"github.com/charlesderek/actor-model/remote"
)
type client struct {
username string
serverPID *actor.PID
}
func newClient(username string, serverPID *actor.PID) actor.Producer {
return func() actor.Receiver {
return &client{
username: username,
serverPID: serverPID,
}
}
}
func (c *client) Receive(ctx *actor.Context) {
switch msg := ctx.Message().(type) {
case *types.Message:
fmt.Printf("username: %s :: %s\n", msg.Username, msg.Msg)
case actor.Started:
ctx.Send(c.serverPID, &types.Connect{
Username: c.username,
})
case actor.Stopped:
}
}
func main() {
var (
port = flag.String("port", ":3000", "")
username = flag.String("username", "", "")
)
flag.Parse()
e := actor.NewEngine()
rem := remote.New(e, remote.Config{
ListenAddr: "127.0.0.1" + *port,
})
e.WithRemote(rem)
var (
// the process ID of the server
serverPID = actor.NewPID("127.0.0.1:4000", "server")
// Spawn our client receiver
clientPID = e.Spawn(newClient(*username, serverPID), "client")
r = bufio.NewReader(os.Stdin)
)
for {
str, err := r.ReadString('\n')
if err != nil {
log.Errorw("failed to read message from stdin", log.M{"err": err})
break
}
msg := &types.Message{
Msg: str,
Username: *username,
}
// We use SendWithSender here so the server knows who
// is sending the message.
e.SendWithSender(serverPID, msg, clientPID)
}
// When breaked out of the loop on error let the server know
// we need to disconnect.
e.SendWithSender(serverPID, &types.Disconnect{}, clientPID)
}