forked from francoispqt/gojay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
82 lines (70 loc) · 1.46 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
package server
import (
"log"
"math/rand"
"net/http"
"sync"
"time"
"github.com/francoispqt/gojay/examples/websocket/comm"
"golang.org/x/net/websocket"
)
type server struct {
clients []*Client
mux *sync.RWMutex
handle func(c *Client)
}
type Client struct {
comm.SenderReceiver
server *server
}
func NewClient(s *server, conn *websocket.Conn) *Client {
sC := new(Client)
sC.Conn = conn
sC.server = s
return sC
}
func NewServer() *server {
s := new(server)
s.mux = new(sync.RWMutex)
s.clients = make([]*Client, 0, 100)
return s
}
func (c *Client) Close() {
c.Conn.Close()
}
func (s *server) Handle(conn *websocket.Conn) {
defer func() {
err := conn.Close()
if err != nil {
log.Fatal(err)
}
}()
c := NewClient(s, conn)
// add our server client to the list of clients
s.mux.Lock()
s.clients = append(s.clients, c)
s.mux.Unlock()
// init Client's sender and receiver
c.Init(10)
s.handle(c)
// block until reader is done
<-c.Dec.Done()
}
func (s *server) Listen(port string, done chan error) {
http.Handle("/ws", websocket.Handler(s.Handle))
done <- http.ListenAndServe(port, nil)
}
func (s *server) OnConnection(h func(c *Client)) {
s.handle = h
}
func random(min, max int) int {
rand.Seed(time.Now().Unix())
return rand.Intn(max-min) + min
}
func (s *server) BroadCastRandom(sC *Client, m *comm.Message) {
m.Message = "Random message"
s.mux.RLock()
r := random(0, len(s.clients))
s.clients[r].SendMessage(m)
s.mux.RUnlock()
}