gtcp_server.go 4.0 KB

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