/
wsclientmanager.go
73 lines (66 loc) · 1.85 KB
/
wsclientmanager.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
package lightclient
import (
"encoding/json"
"github.com/gorilla/websocket"
"log"
"obd/bean"
)
type Client struct {
Id string
User *bean.User
Socket *websocket.Conn
SendChannel chan []byte
}
type ClientManager struct {
Broadcast chan []byte
Connected chan *Client
Disconnected chan *Client
P2PData chan []byte
ClientsMap map[*Client]bool
OnlineUserMap map[string]*Client
}
var GlobalWsClientManager = ClientManager{
Broadcast: make(chan []byte),
Connected: make(chan *Client),
Disconnected: make(chan *Client),
P2PData: make(chan []byte),
ClientsMap: make(map[*Client]bool),
OnlineUserMap: make(map[string]*Client),
}
func (clientManager *ClientManager) Start() {
for {
select {
case conn := <-clientManager.Connected:
clientManager.ClientsMap[conn] = true
jsonMessage, _ := json.Marshal(&bean.RequestMessage{Data: "A new socket has connected."})
log.Println("new socket has connected.")
clientManager.Send(jsonMessage, conn)
case conn := <-clientManager.Disconnected:
if _, ok := clientManager.ClientsMap[conn]; ok {
close(conn.SendChannel)
delete(clientManager.ClientsMap, conn)
jsonMessage, _ := json.Marshal(&bean.RequestMessage{Data: "A socket has disconnected."})
log.Println("socket has disconnected.")
clientManager.Send(jsonMessage, conn)
}
case P2PData := <-clientManager.P2PData:
log.Println(string(P2PData))
case orderMessage := <-clientManager.Broadcast:
for conn := range clientManager.ClientsMap {
select {
case conn.SendChannel <- orderMessage:
default:
close(conn.SendChannel)
delete(clientManager.ClientsMap, conn)
}
}
}
}
}
func (clientManager *ClientManager) Send(message []byte, myself *Client) {
for conn := range clientManager.ClientsMap {
if conn == myself {
conn.SendChannel <- message
}
}
}