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 }