Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

94 Zeilen
1.8KB

  1. package main
  2. import (
  3. "github.com/gorilla/websocket"
  4. "sync"
  5. )
  6. type wsQ struct {
  7. wsMutex sync.Mutex
  8. Clients map[*websocket.Conn]struct{}
  9. ClientsBySession map[string]*websocket.Conn
  10. }
  11. var wsq = wsQ{
  12. Clients: make(map[*websocket.Conn]struct{}),
  13. ClientsBySession: make(map[string]*websocket.Conn),
  14. }
  15. func (m *wsQ) addConnection(c *websocket.Conn) {
  16. m.wsMutex.Lock()
  17. m.Clients[c] = struct{}{}
  18. m.wsMutex.Unlock()
  19. }
  20. func (m *wsQ) MapMidToConnection(mid string, c *websocket.Conn) {
  21. m.wsMutex.Lock()
  22. m.ClientsBySession[mid] = c
  23. m.wsMutex.Unlock()
  24. }
  25. func (m *wsQ) has(conn *websocket.Conn) (yes bool) {
  26. m.wsMutex.Lock()
  27. _, ok := m.Clients[conn]
  28. m.wsMutex.Unlock()
  29. return ok
  30. }
  31. func (m *wsQ) getConnBySessionId(sid string) (conn *websocket.Conn) {
  32. conn = nil
  33. m.wsMutex.Lock()
  34. for k, v := range m.ClientsBySession {
  35. if k == sid {
  36. conn = v
  37. break
  38. }
  39. }
  40. m.wsMutex.Unlock()
  41. return
  42. }
  43. func (m *wsQ) del(conn *websocket.Conn) {
  44. m.wsMutex.Lock()
  45. delete(m.Clients, conn)
  46. for k, v := range m.ClientsBySession {
  47. if v == conn {
  48. delete(m.ClientsBySession, k)
  49. break
  50. }
  51. }
  52. m.wsMutex.Unlock()
  53. }
  54. func (m *wsQ) delBySessionId(sid string) {
  55. m.wsMutex.Lock()
  56. for k, v := range m.ClientsBySession {
  57. if k == sid {
  58. delete(m.ClientsBySession, k)
  59. break
  60. }
  61. delete(m.Clients, v)
  62. }
  63. m.wsMutex.Unlock()
  64. }
  65. func (m *wsQ) wsDoBroadcast(msg string, except string) {
  66. toBeRemoved := make([]*websocket.Conn, 0, 20)
  67. m.wsMutex.Lock()
  68. for k, _ := range m.Clients {
  69. if m.ClientsBySession[except] == k {
  70. continue
  71. }
  72. err := k.WriteMessage(websocket.TextMessage, []byte(msg))
  73. if err != nil {
  74. toBeRemoved = append(toBeRemoved, k)
  75. }
  76. }
  77. // remove all those have errors for communication
  78. for _, v := range toBeRemoved {
  79. delete(m.Clients, v)
  80. }
  81. m.wsMutex.Unlock()
  82. }