server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package websocket
  2. import (
  3. "net/http"
  4. "github.com/ethereum/go-ethereum/logger"
  5. ws "code.google.com/p/go.net/websocket"
  6. )
  7. var wslogger = logger.NewLogger("WS")
  8. // Chat server.
  9. type Server struct {
  10. httpServ string
  11. pattern string
  12. messages []*Message
  13. clients map[int]*Client
  14. addCh chan *Client
  15. delCh chan *Client
  16. sendAllCh chan string
  17. doneCh chan bool
  18. errCh chan error
  19. msgFunc MsgFunc
  20. }
  21. // Create new chat server.
  22. func NewServer(pattern, httpServ string) *Server {
  23. clients := make(map[int]*Client)
  24. addCh := make(chan *Client)
  25. delCh := make(chan *Client)
  26. sendAllCh := make(chan string)
  27. doneCh := make(chan bool)
  28. errCh := make(chan error)
  29. return &Server{
  30. httpServ,
  31. pattern,
  32. nil,
  33. clients,
  34. addCh,
  35. delCh,
  36. sendAllCh,
  37. doneCh,
  38. errCh,
  39. nil,
  40. }
  41. }
  42. func (s *Server) Add(c *Client) {
  43. s.addCh <- c
  44. }
  45. func (s *Server) Del(c *Client) {
  46. s.delCh <- c
  47. }
  48. func (s *Server) SendAll(msg string) {
  49. s.sendAllCh <- msg
  50. }
  51. func (s *Server) Done() {
  52. s.doneCh <- true
  53. }
  54. func (s *Server) Err(err error) {
  55. s.errCh <- err
  56. }
  57. func (s *Server) servHTTP() {
  58. wslogger.Debugln("Serving http", s.httpServ)
  59. err := http.ListenAndServe(s.httpServ, nil)
  60. wslogger.Warnln(err)
  61. }
  62. func (s *Server) MessageFunc(f MsgFunc) {
  63. s.msgFunc = f
  64. }
  65. // Listen and serve.
  66. // It serves client connection and broadcast request.
  67. func (s *Server) Listen() {
  68. wslogger.Debugln("Listening server...")
  69. // ws handler
  70. onConnected := func(ws *ws.Conn) {
  71. defer func() {
  72. err := ws.Close()
  73. if err != nil {
  74. s.errCh <- err
  75. }
  76. }()
  77. client := NewClient(ws, s)
  78. client.onMessage = s.msgFunc
  79. s.Add(client)
  80. client.Listen()
  81. }
  82. // Disable Origin check. Request don't need to come necessarily from origin.
  83. http.HandleFunc(s.pattern, func(w http.ResponseWriter, req *http.Request) {
  84. s := ws.Server{Handler: ws.Handler(onConnected)}
  85. s.ServeHTTP(w, req)
  86. })
  87. wslogger.Debugln("Created handler")
  88. go s.servHTTP()
  89. for {
  90. select {
  91. // Add new a client
  92. case c := <-s.addCh:
  93. s.clients[c.id] = c
  94. // del a client
  95. case c := <-s.delCh:
  96. delete(s.clients, c.id)
  97. case err := <-s.errCh:
  98. wslogger.Debugln("Error:", err.Error())
  99. case <-s.doneCh:
  100. return
  101. }
  102. }
  103. }