gtcp_server.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 gtcp
  7. import (
  8. "crypto/tls"
  9. "github.com/gogf/gf/errors/gcode"
  10. "github.com/gogf/gf/errors/gerror"
  11. "net"
  12. "sync"
  13. "github.com/gogf/gf/container/gmap"
  14. "github.com/gogf/gf/os/glog"
  15. "github.com/gogf/gf/util/gconv"
  16. )
  17. const (
  18. // defaultServer is the default TCP server name.
  19. defaultServer = "default"
  20. )
  21. // Server is a TCP server.
  22. type Server struct {
  23. mu sync.Mutex // Used for Server.listen concurrent safety.
  24. listen net.Listener // Listener.
  25. address string // Server listening address.
  26. handler func(*Conn) // Connection handler.
  27. tlsConfig *tls.Config // TLS configuration.
  28. }
  29. // Map for name to server, for singleton purpose.
  30. var serverMapping = gmap.NewStrAnyMap(true)
  31. // GetServer returns the TCP server with specified <name>,
  32. // or it returns a new normal TCP server named <name> if it does not exist.
  33. // The parameter <name> is used to specify the TCP server
  34. func GetServer(name ...interface{}) *Server {
  35. serverName := defaultServer
  36. if len(name) > 0 && name[0] != "" {
  37. serverName = gconv.String(name[0])
  38. }
  39. return serverMapping.GetOrSetFuncLock(serverName, func() interface{} {
  40. return NewServer("", nil)
  41. }).(*Server)
  42. }
  43. // NewServer creates and returns a new normal TCP server.
  44. // The parameter <name> is optional, which is used to specify the instance name of the server.
  45. func NewServer(address string, handler func(*Conn), name ...string) *Server {
  46. s := &Server{
  47. address: address,
  48. handler: handler,
  49. }
  50. if len(name) > 0 && name[0] != "" {
  51. serverMapping.Set(name[0], s)
  52. }
  53. return s
  54. }
  55. // NewServerTLS creates and returns a new TCP server with TLS support.
  56. // The parameter <name> is optional, which is used to specify the instance name of the server.
  57. func NewServerTLS(address string, tlsConfig *tls.Config, handler func(*Conn), name ...string) *Server {
  58. s := NewServer(address, handler, name...)
  59. s.SetTLSConfig(tlsConfig)
  60. return s
  61. }
  62. // NewServerKeyCrt creates and returns a new TCP server with TLS support.
  63. // The parameter <name> is optional, which is used to specify the instance name of the server.
  64. func NewServerKeyCrt(address, crtFile, keyFile string, handler func(*Conn), name ...string) *Server {
  65. s := NewServer(address, handler, name...)
  66. if err := s.SetTLSKeyCrt(crtFile, keyFile); err != nil {
  67. glog.Error(err)
  68. }
  69. return s
  70. }
  71. // SetAddress sets the listening address for server.
  72. func (s *Server) SetAddress(address string) {
  73. s.address = address
  74. }
  75. // SetHandler sets the connection handler for server.
  76. func (s *Server) SetHandler(handler func(*Conn)) {
  77. s.handler = handler
  78. }
  79. // SetTLSKeyCrt sets the certificate and key file for TLS configuration of server.
  80. func (s *Server) SetTLSKeyCrt(crtFile, keyFile string) error {
  81. tlsConfig, err := LoadKeyCrt(crtFile, keyFile)
  82. if err != nil {
  83. return err
  84. }
  85. s.tlsConfig = tlsConfig
  86. return nil
  87. }
  88. // SetTLSConfig sets the TLS configuration of server.
  89. func (s *Server) SetTLSConfig(tlsConfig *tls.Config) {
  90. s.tlsConfig = tlsConfig
  91. }
  92. // Close closes the listener and shutdowns the server.
  93. func (s *Server) Close() error {
  94. s.mu.Lock()
  95. defer s.mu.Unlock()
  96. if s.listen == nil {
  97. return nil
  98. }
  99. return s.listen.Close()
  100. }
  101. // Run starts running the TCP Server.
  102. func (s *Server) Run() (err error) {
  103. if s.handler == nil {
  104. err = gerror.NewCode(gcode.CodeMissingConfiguration, "start running failed: socket handler not defined")
  105. glog.Error(err)
  106. return
  107. }
  108. if s.tlsConfig != nil {
  109. // TLS Server
  110. s.mu.Lock()
  111. s.listen, err = tls.Listen("tcp", s.address, s.tlsConfig)
  112. s.mu.Unlock()
  113. if err != nil {
  114. glog.Error(err)
  115. return
  116. }
  117. } else {
  118. // Normal Server
  119. addr, err := net.ResolveTCPAddr("tcp", s.address)
  120. if err != nil {
  121. glog.Error(err)
  122. return err
  123. }
  124. s.mu.Lock()
  125. s.listen, err = net.ListenTCP("tcp", addr)
  126. s.mu.Unlock()
  127. if err != nil {
  128. glog.Error(err)
  129. return err
  130. }
  131. }
  132. // Listening loop.
  133. for {
  134. if conn, err := s.listen.Accept(); err != nil {
  135. return err
  136. } else if conn != nil {
  137. go s.handler(NewConnByNetConn(conn))
  138. }
  139. }
  140. }