server_ws.go 1.9 KB

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