mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
http/tcp/udp server封装结构优化
This commit is contained in:
32
g/g.go
32
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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -6,6 +6,6 @@ import (
|
||||
)
|
||||
|
||||
func main() {
|
||||
g.HttpServer().SetPort(8199)
|
||||
g.HttpServer().Run()
|
||||
g.HTTPServer().SetPort(8199)
|
||||
g.HTTPServer().Run()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user