gudp_server.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. package gudp
  7. import (
  8. "errors"
  9. "net"
  10. "github.com/gogf/gf/container/gmap"
  11. "github.com/gogf/gf/os/glog"
  12. "github.com/gogf/gf/util/gconv"
  13. )
  14. const (
  15. gDEFAULT_SERVER = "default"
  16. )
  17. // Server is the UDP server.
  18. type Server struct {
  19. conn *Conn // UDP server connection object.
  20. address string // UDP server listening address.
  21. handler func(*Conn) // Handler for UDP connection.
  22. }
  23. var (
  24. // serverMapping is used for instance name to its UDP server mappings.
  25. serverMapping = gmap.NewStrAnyMap(true)
  26. )
  27. // GetServer creates and returns a UDP server instance with given name.
  28. func GetServer(name ...interface{}) *Server {
  29. serverName := gDEFAULT_SERVER
  30. if len(name) > 0 && name[0] != "" {
  31. serverName = gconv.String(name[0])
  32. }
  33. if s := serverMapping.Get(serverName); s != nil {
  34. return s.(*Server)
  35. }
  36. s := NewServer("", nil)
  37. serverMapping.Set(serverName, s)
  38. return s
  39. }
  40. // NewServer creates and returns a UDP server.
  41. // The optional parameter <name> is used to specify its name, which can be used for
  42. // GetServer function to retrieve its instance.
  43. func NewServer(address string, handler func(*Conn), name ...string) *Server {
  44. s := &Server{
  45. address: address,
  46. handler: handler,
  47. }
  48. if len(name) > 0 && name[0] != "" {
  49. serverMapping.Set(name[0], s)
  50. }
  51. return s
  52. }
  53. // SetAddress sets the server address for UDP server.
  54. func (s *Server) SetAddress(address string) {
  55. s.address = address
  56. }
  57. // SetHandler sets the connection handler for UDP server.
  58. func (s *Server) SetHandler(handler func(*Conn)) {
  59. s.handler = handler
  60. }
  61. // Close closes the connection.
  62. // It will make server shutdowns immediately.
  63. func (s *Server) Close() error {
  64. return s.conn.Close()
  65. }
  66. // Run starts listening UDP connection.
  67. func (s *Server) Run() error {
  68. if s.handler == nil {
  69. err := errors.New("start running failed: socket handler not defined")
  70. glog.Error(err)
  71. return err
  72. }
  73. addr, err := net.ResolveUDPAddr("udp", s.address)
  74. if err != nil {
  75. glog.Error(err)
  76. return err
  77. }
  78. conn, err := net.ListenUDP("udp", addr)
  79. if err != nil {
  80. glog.Error(err)
  81. return err
  82. }
  83. s.conn = NewConnByNetConn(conn)
  84. s.handler(s.conn)
  85. return nil
  86. }