code: func (s *Server) Start(loopFn func(IOSession) error) error {
  	addr, err := net.ResolveTCPAddr("tcp", s.addr)
  
  	if err != nil {
  		return err
  	}
  
  	s.listener, err = net.ListenTCP("tcp", addr)
  
  	if err != nil {
  		return err
  	}
  
  	s.startCh <- struct{}{}
  
  	var tempDelay time.Duration
  	for {
  		conn, err := s.listener.AcceptTCP()
  
  		if s.stopped {
  			if nil != conn {
  				conn.Close()
  			}
  
  			return nil
  		}
  
  		if err != nil {
  			if ne, ok := err.(net.Error); ok && ne.Temporary() {
  				if tempDelay == 0 {
  					tempDelay = 5 * time.Millisecond
  				} else {
  					tempDelay *= 2
  				}
  				if max := 1 * time.Second; tempDelay > max {
  					tempDelay = max
  				}
  				time.Sleep(tempDelay)
  				continue
  			}
  			return err
  		}
  		tempDelay = 0
  
  		session := newClientIOSession(s.opts.generator.NewID(), conn, s)
  		s.addSession(session)
  
  		go func() {
  			defer func() {
  				if err := recover(); err != nil {
  					const size = 64 << 10
  					rBuf := make([]byte, size)
  					rBuf = rBuf[:runtime.Stack(rBuf, false)]
  					log.Printf("goetty: connection painc %+v, stack:\n%s",
  						err,
  						rBuf)
  				}
  			}()
  
  			loopFn(session)
  			session.Close()
  			s.deleteSession(session)
  		}()
  	}
  }
docs: // Start start the server, this method will block until occur a error