server_ws.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package cpn
  2. import (
  3. "net/http"
  4. "git.wenlab.co/joe/nnet"
  5. "github.com/gorilla/mux"
  6. "github.com/gorilla/websocket"
  7. )
  8. type CallbackWsPath func(http.ResponseWriter, *http.Request)
  9. type WsServer struct {
  10. *Hub
  11. addr string
  12. wspath string
  13. svr *http.Server
  14. upgrader *websocket.Upgrader
  15. routes map[string]CallbackWsPath
  16. }
  17. func NewWsServer(cf *nnet.HubConfig, cb nnet.ISessionCallback, p nnet.IProtocol,
  18. addr string, wspath string, routes map[string]CallbackWsPath) nnet.IHub {
  19. return &WsServer{
  20. Hub: newHub(cf, cb, p),
  21. addr: addr,
  22. wspath: wspath,
  23. upgrader: &websocket.Upgrader{
  24. ReadBufferSize: cf.ReadBufSize,
  25. WriteBufferSize: cf.WriteBufSize,
  26. CheckOrigin: func(r *http.Request) bool {
  27. return true
  28. },
  29. },
  30. routes: routes,
  31. }
  32. }
  33. func (self *WsServer) Start() error {
  34. router := mux.NewRouter()
  35. for k, v := range self.routes {
  36. router.HandleFunc(k, v)
  37. }
  38. router.HandleFunc("/", self.do_homepage)
  39. router.HandleFunc(self.wspath, func(w http.ResponseWriter, r *http.Request) {
  40. self.do_new_session(w, r)
  41. })
  42. self.svr = &http.Server{
  43. Addr: self.addr,
  44. Handler: router,
  45. }
  46. err := self.svr.ListenAndServe()
  47. return err
  48. }
  49. func (self *WsServer) do_homepage(w http.ResponseWriter, r *http.Request) {
  50. if r.URL.Path != "/" {
  51. http.Error(w, "Not found", http.StatusNotFound)
  52. return
  53. }
  54. if r.Method != "GET" {
  55. http.Error(w, "Method now allowed", http.StatusMethodNotAllowed)
  56. return
  57. }
  58. w.Write([]byte("welcome to nnet v" + nnet.VERSION))
  59. }
  60. func (self *WsServer) do_new_session(w http.ResponseWriter, r *http.Request) {
  61. conn, err := self.upgrader.Upgrade(w, r, nil)
  62. if nil != err {
  63. return
  64. }
  65. self.wg.Add(1)
  66. go func() {
  67. ses := newSession(NewWsConn(conn), self)
  68. ses.Do()
  69. self.wg.Done()
  70. }()
  71. }
  72. func (self *WsServer) Stop() error {
  73. self.svr.Close()
  74. return self.Hub.Stop()
  75. }