github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgNet/kmgHttp/NetServer.go (about)

     1  package kmgHttp
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"net/http"
     7  
     8  	"github.com/bronze1man/kmg/kmgNet"
     9  )
    10  
    11  // 一个可以关闭的http服务器
    12  func MustNewHttpNetServerV2(Addr string, handler http.Handler) func() error {
    13  	s := NewHttpNetServer(Addr, handler)
    14  	err := s.Start()
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  	return s.Close
    19  }
    20  
    21  //一个http的满足 kmgNet.Server接口的服务器
    22  func NewHttpNetServer(Addr string, handler http.Handler) kmgNet.Server {
    23  	return &httpNetServer{
    24  		Server: &http.Server{
    25  			Handler: handler,
    26  		},
    27  		addr: Addr,
    28  	}
    29  }
    30  
    31  type httpNetServer struct {
    32  	*http.Server
    33  	addr     string
    34  	listener net.Listener
    35  }
    36  
    37  func (s *httpNetServer) Start() error {
    38  	var err error
    39  	s.listener, err = net.Listen("tcp", s.addr)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	go func() {
    44  		err := s.Server.Serve(s.listener)
    45  		if err != nil {
    46  			if kmgNet.IsSocketCloseError(err) {
    47  				return
    48  			}
    49  			panic(err)
    50  		}
    51  	}()
    52  	return nil
    53  }
    54  
    55  func (s *httpNetServer) Close() error {
    56  	return s.listener.Close()
    57  }
    58  
    59  func (s *httpNetServer) Addr() (net.Addr, error) {
    60  	if s.listener == nil {
    61  		return nil, fmt.Errorf("[httpNetServer] you should start server first")
    62  	}
    63  	return s.listener.Addr(), nil
    64  }