gudp_server.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright GoFrame Author(https://goframe.org). 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. "github.com/gogf/gf/errors/gcode"
  9. "github.com/gogf/gf/errors/gerror"
  10. "net"
  11. "github.com/gogf/gf/container/gmap"
  12. "github.com/gogf/gf/os/glog"
  13. "github.com/gogf/gf/util/gconv"
  14. )
  15. const (
  16. defaultServer = "default"
  17. )
  18. // Server is the UDP server.
  19. type Server struct {
  20. conn *Conn // UDP server connection object.
  21. address string // UDP server listening address.
  22. handler func(*Conn) // Handler for UDP connection.
  23. }
  24. var (
  25. // serverMapping is used for instance name to its UDP server mappings.
  26. serverMapping = gmap.NewStrAnyMap(true)
  27. )
  28. // GetServer creates and returns a UDP server instance with given name.
  29. func GetServer(name ...interface{}) *Server {
  30. serverName := defaultServer
  31. if len(name) > 0 && name[0] != "" {
  32. serverName = gconv.String(name[0])
  33. }
  34. if s := serverMapping.Get(serverName); s != nil {
  35. return s.(*Server)
  36. }
  37. s := NewServer("", nil)
  38. serverMapping.Set(serverName, s)
  39. return s
  40. }
  41. // NewServer creates and returns a UDP server.
  42. // The optional parameter <name> is used to specify its name, which can be used for
  43. // GetServer function to retrieve its instance.
  44. func NewServer(address string, handler func(*Conn), name ...string) *Server {
  45. s := &Server{
  46. address: address,
  47. handler: handler,
  48. }
  49. if len(name) > 0 && name[0] != "" {
  50. serverMapping.Set(name[0], s)
  51. }
  52. return s
  53. }
  54. // SetAddress sets the server address for UDP server.
  55. func (s *Server) SetAddress(address string) {
  56. s.address = address
  57. }
  58. // SetHandler sets the connection handler for UDP server.
  59. func (s *Server) SetHandler(handler func(*Conn)) {
  60. s.handler = handler
  61. }
  62. // Close closes the connection.
  63. // It will make server shutdowns immediately.
  64. func (s *Server) Close() error {
  65. return s.conn.Close()
  66. }
  67. // Run starts listening UDP connection.
  68. func (s *Server) Run() error {
  69. if s.handler == nil {
  70. err := gerror.NewCode(gcode.CodeMissingConfiguration, "start running failed: socket handler not defined")
  71. glog.Error(err)
  72. return err
  73. }
  74. addr, err := net.ResolveUDPAddr("udp", s.address)
  75. if err != nil {
  76. glog.Error(err)
  77. return err
  78. }
  79. conn, err := net.ListenUDP("udp", addr)
  80. if err != nil {
  81. glog.Error(err)
  82. return err
  83. }
  84. s.conn = NewConnByNetConn(conn)
  85. s.handler(s.conn)
  86. return nil
  87. }