From f50059f58409cab141e50268dfaf048a101c90c6 Mon Sep 17 00:00:00 2001 From: John Date: Sat, 30 Dec 2017 17:09:00 +0800 Subject: [PATCH] =?UTF-8?q?http/tcp/udp=20server=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/g.go | 32 +++++++++++++++++++++--- g/net/ghttp/http_server.go | 10 +++++--- g/net/grouter/grouter.go | 4 ++- g/net/gtcp/tcp.go | 35 +++++++++++++++----------- g/net/gtcp/tcp_server.go | 31 ++++++++++++++++++----- g/net/gudp/udp.go | 35 +++++++++++++++----------- g/net/gudp/udp_server.go | 36 +++++++++++++++++++-------- geg/frame/mvc/controller/user/user.go | 2 -- geg/frame/mvc/main.go | 4 +-- 9 files changed, 132 insertions(+), 57 deletions(-) diff --git a/g/g.go b/g/g.go index 05dd30e6f..24f76ef16 100644 --- a/g/g.go +++ b/g/g.go @@ -6,15 +6,39 @@ // package g -import "gitee.com/johng/gf/g/net/ghttp" +import ( + "gitee.com/johng/gf/g/net/gtcp" + "gitee.com/johng/gf/g/net/gudp" + "gitee.com/johng/gf/g/net/ghttp" +) -const HTTP = 1 -// 核心对象:Server +// 单例HTTP Server // 框架支持多服务器对象,通过传入不同的name进行区分 -func HttpServer(names...string) *ghttp.Server { +func HTTPServer(names...string) *ghttp.Server { name := "default" if len(names) > 0 { name = names[0] } return ghttp.GetServer(name) } + +// 单例TCP Server +// 框架支持多服务器对象,通过传入不同的name进行区分 +func TCPServer(names...string) *gtcp.Server { + name := "default" + if len(names) > 0 { + name = names[0] + } + return gtcp.GetServer(name) +} + + +// 单例HTTP Server +// 框架支持多服务器对象,通过传入不同的name进行区分 +func UDPServer(names...string) *gudp.Server { + name := "default" + if len(names) > 0 { + name = names[0] + } + return gudp.GetServer(name) +} diff --git a/g/net/ghttp/http_server.go b/g/net/ghttp/http_server.go index ab377f7b3..353345c76 100644 --- a/g/net/ghttp/http_server.go +++ b/g/net/ghttp/http_server.go @@ -62,10 +62,12 @@ func GetServer(name string) (*Server) { if s := serverMapping.Get(name); s != nil { return s.(*Server) } - s := &Server{} - s.name = name - s.handlerMap = make(HandlerMap) - s.methodsMap = make(map[string]bool) + s := &Server{ + name : name, + handlerMap : make(HandlerMap), + methodsMap : make(map[string]bool), + Router : grouter.New(), + } for _, v := range strings.Split(gHTTP_METHODS, ",") { s.methodsMap[v] = true } diff --git a/g/net/grouter/grouter.go b/g/net/grouter/grouter.go index d6cec4cc4..35cf33d16 100644 --- a/g/net/grouter/grouter.go +++ b/g/net/grouter/grouter.go @@ -3,7 +3,7 @@ // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://gitee.com/johng/gf. - +// package grouter import ( @@ -71,6 +71,7 @@ func (r *Router) RemovePatchRule(rule string) { r.updatePatchKeys() } +// 内部更新解析索引规则排序,便于运行时使用 func (r *Router) updateDispatchKeys() { r.dmu.Lock() defer r.dmu.Unlock() @@ -78,6 +79,7 @@ func (r *Router) updateDispatchKeys() { sort.Slice(r.dkeys, func(i, j int) bool { return len(r.dkeys[i]) > len(r.dkeys[j]) }) } +// 内部更新所打包引规则排序,便于运行时使用 func (r *Router) updatePatchKeys() { r.pmu.Lock() defer r.pmu.Unlock() diff --git a/g/net/gtcp/tcp.go b/g/net/gtcp/tcp.go index 9ad2e3b62..11c4d87f5 100644 --- a/g/net/gtcp/tcp.go +++ b/g/net/gtcp/tcp.go @@ -8,28 +8,35 @@ package gtcp import ( "net" - "gitee.com/johng/gf/g/os/glog" + "gitee.com/johng/gf/g/container/gmap" ) // tcp server结构体 type Server struct { address string - listener *net.TCPListener handler func (net.Conn) } -// 创建一个tcp server对象 -func NewServer(address string, handler func (net.Conn)) *Server { - tcpaddr, err := net.ResolveTCPAddr("tcp4", address) - if err != nil { - glog.Fatalln(err) - return nil +// Server表,用以存储和检索名称与Server对象之间的关联关系 +var serverMapping = gmap.NewStringInterfaceMap() + +// 获取/创建一个空配置的TCP Server +// 单例模式,请保证name的唯一性 +func GetServer(name string) (*Server) { + if s := serverMapping.Get(name); s != nil { + return s.(*Server) } - listen, err := net.ListenTCP("tcp", tcpaddr) - if err != nil { - glog.Fatalln(err) - return nil - } - return &Server{ address, listen, handler} + s := NewServer("", nil) + serverMapping.Set(name, s) + return s +} + +// 创建一个tcp server对象,并且可以选择指定一个单例名字 +func NewServer(address string, handler func (net.Conn), names...string) *Server { + s := &Server{address, handler} + if len(names) > 0 { + serverMapping.Set(names[0], s) + } + return s } diff --git a/g/net/gtcp/tcp_server.go b/g/net/gtcp/tcp_server.go index 3e1f9dc97..afc64b59a 100644 --- a/g/net/gtcp/tcp_server.go +++ b/g/net/gtcp/tcp_server.go @@ -7,21 +7,40 @@ package gtcp import ( + "errors" "gitee.com/johng/gf/g/os/glog" + "net" ) +// 设置参数 - address +func (s *Server) SetAddress (address string) { + s.address = address +} + +// 设置参数 - handler +func (s *Server) SetHandler (handler func (net.Conn)) { + s.handler = handler +} + // 执行监听 -func (s *Server) Run() { - if s == nil || s.listener == nil { - glog.Println("start running failed: socket address bind failed") - return +func (s *Server) Run() error { + if s.handler == nil { + return errors.New("start running failed: socket handler not defined") + } + tcpaddr, err := net.ResolveTCPAddr("tcp4", s.address) + if err != nil { + return err + } + listen, err := net.ListenTCP("tcp", tcpaddr) + if err != nil { + return err } for { - conn, err := s.listener.Accept() - if err != nil { + if conn, err := listen.Accept(); err != nil { glog.Error(err) } else if conn != nil { go s.handler(conn) } } + return nil } diff --git a/g/net/gudp/udp.go b/g/net/gudp/udp.go index b3c0ea3a1..3242ce3c7 100644 --- a/g/net/gudp/udp.go +++ b/g/net/gudp/udp.go @@ -8,28 +8,35 @@ package gudp import ( "net" - "gitee.com/johng/gf/g/os/glog" + "gitee.com/johng/gf/g/container/gmap" ) // tcp server结构体 type Server struct { address string - listener *net.UDPConn handler func (*net.UDPConn) } -// 创建一个tcp server对象 -func NewServer (address string, handler func (*net.UDPConn)) *Server { - tcpaddr, err := net.ResolveUDPAddr("udp4", address) - if err != nil { - glog.Println(err) - return nil +// Server表,用以存储和检索名称与Server对象之间的关联关系 +var serverMapping = gmap.NewStringInterfaceMap() + +// 获取/创建一个空配置的UDP Server +// 单例模式,请保证name的唯一性 +func GetServer(name string) (*Server) { + if s := serverMapping.Get(name); s != nil { + return s.(*Server) } - listen, err := net.ListenUDP("udp", tcpaddr) - if err != nil { - glog.Println(err) - return nil - } - return &Server{ address, listen, handler} + s := NewServer("", nil) + serverMapping.Set(name, s) + return s +} + +// 创建一个tcp server对象,并且可以选择指定一个单例名字 +func NewServer (address string, handler func (*net.UDPConn), names...string) *Server { + s := &Server{address, handler} + if len(names) > 0 { + serverMapping.Set(names[0], s) + } + return s } diff --git a/g/net/gudp/udp_server.go b/g/net/gudp/udp_server.go index 18d53ffc2..bb6ae31cb 100644 --- a/g/net/gudp/udp_server.go +++ b/g/net/gudp/udp_server.go @@ -6,20 +6,36 @@ package gudp -import "gitee.com/johng/gf/g/os/glog" +import ( + "net" + "errors" +) + +// 设置参数 - address +func (s *Server) SetAddress (address string) { + s.address = address +} + +// 设置参数 - handler +func (s *Server) SetHandler (handler func (*net.UDPConn)) { + s.handler = handler +} // 执行监听 -func (s *Server) Run() { - if s == nil || s.listener == nil { - glog.Println("start running failed: socket address bind failed") - return - } +func (s *Server) Run() error { if s.handler == nil { - glog.Println("start running failed: socket handler not defined") - return + return errors.New("start running failed: socket handler not defined") + } + tcpaddr, err := net.ResolveUDPAddr("udp4", s.address) + if err != nil { + return err + } + listen, err := net.ListenUDP("udp", tcpaddr) + if err != nil { + return err } for { - s.handler(s.listener) + s.handler(listen) } - + return nil } diff --git a/geg/frame/mvc/controller/user/user.go b/geg/frame/mvc/controller/user/user.go index 9fdf0c930..2129930ce 100644 --- a/geg/frame/mvc/controller/user/user.go +++ b/geg/frame/mvc/controller/user/user.go @@ -18,12 +18,10 @@ type T struct { func (t *T) Test(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { w.WriteString("Test") - w.Output() } func (t *T) Get(s *ghttp.Server, r *ghttp.ClientRequest, w *ghttp.ServerResponse) { w.WriteString("Http Method GET") - w.Output() } // 初始化控制器对象,并绑定操作到Web Server diff --git a/geg/frame/mvc/main.go b/geg/frame/mvc/main.go index e97810368..8d2c1a770 100644 --- a/geg/frame/mvc/main.go +++ b/geg/frame/mvc/main.go @@ -6,6 +6,6 @@ import ( ) func main() { - g.HttpServer().SetPort(8199) - g.HttpServer().Run() + g.HTTPServer().SetPort(8199) + g.HTTPServer().Run() }