github.com/gogf/gf@v1.16.9/net/gtcp/gtcp_server.go (about)

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