選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

89 行
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]string
  9. ClientsBySession map[string]*websocket.Conn
  10. }
  11. var wsq = wsQ{
  12. Clients: make(map[*websocket.Conn]string),
  13. ClientsBySession: make(map[string]*websocket.Conn),
  14. }
  15. func (m *wsQ) addConnection(c *websocket.Conn) {
  16. m.wsMutex.Lock()
  17. m.Clients[c] = ""
  18. m.wsMutex.Unlock()
  19. }
  20. func (m *wsQ) MapSessionToConnection(sid string, c *websocket.Conn) {
  21. m.wsMutex.Lock()
  22. m.ClientsBySession[sid] = c
  23. m.Clients[c] = sid
  24. m.wsMutex.Unlock()
  25. }
  26. func (m *wsQ) has(conn *websocket.Conn) (yes bool) {
  27. m.wsMutex.Lock()
  28. _, ok := m.Clients[conn]
  29. m.wsMutex.Unlock()
  30. return ok
  31. }
  32. func (m *wsQ) getConnBySessionId(sid string) (conn *websocket.Conn) {
  33. conn = nil
  34. m.wsMutex.Lock()
  35. for k, v := range m.ClientsBySession {
  36. if k == sid {
  37. conn = v
  38. break
  39. }
  40. }
  41. m.wsMutex.Unlock()
  42. return
  43. }
  44. func (m *wsQ) del(conn *websocket.Conn) {
  45. m.wsMutex.Lock()
  46. if sid, exist := m.Clients[conn]; exist {
  47. delete(m.Clients, conn)
  48. delete(m.ClientsBySession, sid)
  49. }
  50. m.wsMutex.Unlock()
  51. }
  52. func (m *wsQ) delBySessionId(sid string) {
  53. m.wsMutex.Lock()
  54. if conn, exist := m.ClientsBySession[sid]; exist {
  55. delete(m.ClientsBySession, sid)
  56. delete(m.Clients, conn)
  57. }
  58. m.wsMutex.Unlock()
  59. }
  60. func (m *wsQ) wsDoBroadcast(msg string, except string) {
  61. toBeRemoved := make([]*websocket.Conn, 0, 20)
  62. m.wsMutex.Lock()
  63. for k, _ := range m.Clients {
  64. if m.ClientsBySession[except] == k {
  65. continue
  66. }
  67. err := k.WriteMessage(websocket.TextMessage, []byte(msg))
  68. if err != nil {
  69. toBeRemoved = append(toBeRemoved, k)
  70. }
  71. }
  72. // remove all those have errors for communication
  73. for _, v := range toBeRemoved {
  74. delete(m.Clients, v)
  75. }
  76. m.wsMutex.Unlock()
  77. }