hub.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package server
  2. import (
  3. "fmt"
  4. "sync"
  5. "sikey.com/websocket/config"
  6. "sikey.com/websocket/utils/zlog"
  7. )
  8. type Hub struct {
  9. serverId string // serverId 服务器ID
  10. clients map[string]*Client
  11. mutex sync.RWMutex
  12. Connect chan *Client
  13. Disconnect chan *Client
  14. Message chan *Message
  15. FirebaseMessage chan *FirebaseMessage
  16. Nats *Nats
  17. }
  18. func NewHub(serverId string) *Hub {
  19. hub := &Hub{
  20. serverId: serverId,
  21. clients: make(map[string]*Client),
  22. mutex: sync.RWMutex{},
  23. Connect: make(chan *Client, config.Websocket.ConnectSize),
  24. Disconnect: make(chan *Client, config.Websocket.ConnectSize),
  25. Message: make(chan *Message, config.Websocket.MessageSize),
  26. Nats: NewNats(config.Websocket.NatsUrl),
  27. }
  28. go hub.run()
  29. return hub
  30. }
  31. func (h *Hub) run() {
  32. for {
  33. select {
  34. case client := <-h.Connect:
  35. h.mutex.Lock()
  36. h.clients[client.UserId] = client
  37. h.mutex.Unlock()
  38. if h.Nats != nil {
  39. h.Nats.Subscribe <- &subscriber{client: client}
  40. }
  41. case client := <-h.Disconnect:
  42. h.mutex.Lock()
  43. close(client.Send)
  44. delete(h.clients, client.UserId)
  45. h.mutex.Unlock()
  46. if h.Nats != nil {
  47. h.Nats.Unsubscribe <- &subscriber{client: client}
  48. }
  49. case message := <-h.Message:
  50. h.mutex.RLock()
  51. if client, ok := h.clients[message.Receiver]; ok {
  52. zlog.Info("message: ", message)
  53. client.Send <- message
  54. } else {
  55. h.Nats.Send <- &natsMessage{userId: message.Receiver, message: message}
  56. }
  57. h.mutex.RUnlock()
  58. case firebaseMessage := <-h.FirebaseMessage:
  59. fmt.Println(firebaseMessage)
  60. }
  61. }
  62. }
  63. func (h *Hub) GetClients() []*Client {
  64. h.mutex.RLock()
  65. defer h.mutex.RUnlock()
  66. var clients = make([]*Client, 0)
  67. for _, c := range h.clients {
  68. clients = append(clients, c)
  69. }
  70. return clients
  71. }