diff --git a/g/g_object.go b/g/g_object.go index 8bb8feaed..5e09f327d 100644 --- a/g/g_object.go +++ b/g/g_object.go @@ -38,8 +38,8 @@ func View(name...string) *gview.View { } // Config returns an instance of config object with specified name. -func Config(file...string) *gcfg.Config { - return gins.Config(file...) +func Config(name...string) *gcfg.Config { + return gins.Config(name...) } // Database returns an instance of database ORM object with specified configuration group name. diff --git a/geg/net/gtcp/pkg_operations/common/funcs/funcs.go b/geg/net/gtcp/pkg_operations/common/funcs/funcs.go new file mode 100644 index 000000000..01fa21914 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/common/funcs/funcs.go @@ -0,0 +1,39 @@ +package funcs + + +import ( + "encoding/json" + "fmt" + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/common/types" +) + +// 自定义格式发送消息包 +func SendPkg(conn *gtcp.Conn, act string, data...string) error { + s := "" + if len(data) > 0 { + s = data[0] + } + msg, err := json.Marshal(types.Msg{ + Act : act, + Data : s, + }) + if err != nil { + panic(err) + } + return conn.SendPkg(msg) +} + +// 自定义格式接收消息包 +func RecvPkg(conn *gtcp.Conn) (msg *types.Msg, err error) { + if data, err := conn.RecvPkg(); err != nil { + return nil, err + } else { + msg = &types.Msg{} + err = json.Unmarshal(data, msg) + if err != nil { + return nil, fmt.Errorf("invalid package structure: %s", err.Error()) + } + return msg, err + } +} \ No newline at end of file diff --git a/geg/net/gtcp/pkg_operations/common/gtcp_common_client.go b/geg/net/gtcp/pkg_operations/common/gtcp_common_client.go new file mode 100644 index 000000000..e4d9ed49c --- /dev/null +++ b/geg/net/gtcp/pkg_operations/common/gtcp_common_client.go @@ -0,0 +1,60 @@ +package main + +import ( + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "github.com/gogf/gf/g/os/gtimer" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/common/funcs" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/common/types" + "time" +) + +func main() { + conn, err := gtcp.NewConn("127.0.0.1:8999") + if err != nil { + panic(err) + } + defer conn.Close() + // 心跳消息 + gtimer.SetInterval(time.Second, func() { + if err := funcs.SendPkg(conn, "heartbeat"); err != nil { + panic(err) + } + }) + // 测试消息, 3秒后向服务端发送hello消息 + gtimer.SetTimeout(3*time.Second, func() { + if err := funcs.SendPkg(conn, "hello", "My name's John!"); err != nil { + panic(err) + } + }) + for { + msg, err := funcs.RecvPkg(conn) + if err != nil { + if err.Error() == "EOF" { + glog.Println("server closed") + } + break + } + switch msg.Act { + case "hello": onServerHello(conn, msg) + case "doexit": onServerDoExit(conn, msg) + case "heartbeat": onServerHeartBeat(conn, msg) + default: + glog.Errorfln("invalid message: %v", msg) + break + } + } +} + +func onServerHello(conn *gtcp.Conn, msg *types.Msg) { + glog.Printfln("hello response message from [%s]: %s", conn.RemoteAddr().String(), msg.Data) +} + +func onServerHeartBeat(conn *gtcp.Conn, msg *types.Msg) { + glog.Printfln("heartbeat from [%s]", conn.RemoteAddr().String()) +} + +func onServerDoExit(conn *gtcp.Conn, msg *types.Msg) { + glog.Printfln("exit command from [%s]", conn.RemoteAddr().String()) + conn.Close() +} \ No newline at end of file diff --git a/geg/net/gtcp/pkg_operations/common/gtcp_common_server.go b/geg/net/gtcp/pkg_operations/common/gtcp_common_server.go new file mode 100644 index 000000000..51bffe544 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/common/gtcp_common_server.go @@ -0,0 +1,45 @@ +package main + +import ( + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "github.com/gogf/gf/g/os/gtimer" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/common/funcs" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/common/types" + "time" +) + +func main() { + gtcp.NewServer("127.0.0.1:8999", func(conn *gtcp.Conn) { + defer conn.Close() + // 测试消息, 10秒后让客户端主动退出 + gtimer.SetTimeout(10*time.Second, func() { + funcs.SendPkg(conn, "doexit") + }) + for { + msg, err := funcs.RecvPkg(conn) + if err != nil { + if err.Error() == "EOF" { + glog.Println("client closed") + } + break + } + switch msg.Act { + case "hello": onClientHello(conn, msg) + case "heartbeat": onClientHeartBeat(conn, msg) + default: + glog.Errorfln("invalid message: %v", msg) + break + } + } + }).Run() +} + +func onClientHello(conn *gtcp.Conn, msg *types.Msg) { + glog.Printfln("hello message from [%s]: %s", conn.RemoteAddr().String(), msg.Data) + funcs.SendPkg(conn, msg.Act, "Nice to meet you!") +} + +func onClientHeartBeat(conn *gtcp.Conn, msg *types.Msg) { + glog.Printfln("heartbeat from [%s]", conn.RemoteAddr().String()) +} diff --git a/geg/net/gtcp/pkg_operations/common/types/type.go b/geg/net/gtcp/pkg_operations/common/types/type.go new file mode 100644 index 000000000..4c52b00d9 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/common/types/type.go @@ -0,0 +1,17 @@ +package types + +import "github.com/gogf/gf/g" + +type Msg struct { + Act string // 操作 + Data string // 数据 +} + +type NodeInfo struct { + Cpu float32 // CPU百分比(%) + Host string // 主机名称 + Ip g.Map // IP地址信息(可能多个) + MemUsed int // 内存使用(byte) + MemTotal int // 内存总量(byte) + Time int // 上报时间(时间戳) +} diff --git a/geg/net/gtcp/pkg_operations/gtcp_server_client1.go b/geg/net/gtcp/pkg_operations/gtcp_server_client1.go new file mode 100644 index 000000000..867a7e404 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/gtcp_server_client1.go @@ -0,0 +1,39 @@ +package main + +import ( + "fmt" + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "github.com/gogf/gf/g/util/gconv" + "time" +) + +func main() { + // Server + go gtcp.NewServer("127.0.0.1:8999", func(conn *gtcp.Conn) { + defer conn.Close() + for { + data, err := conn.RecvPkg() + if err != nil { + fmt.Println(err) + break + } + fmt.Println("receive:", data) + } + }).Run() + + time.Sleep(time.Second) + + // Client + conn, err := gtcp.NewConn("127.0.0.1:8999") + if err != nil { + panic(err) + } + defer conn.Close() + for i := 0; i < 10000; i++ { + if err := conn.SendPkg([]byte(gconv.String(i))); err != nil { + glog.Error(err) + } + time.Sleep(1*time.Second) + } +} diff --git a/geg/net/gtcp/pkg_operations/gtcp_server_client2.go b/geg/net/gtcp/pkg_operations/gtcp_server_client2.go new file mode 100644 index 000000000..519cd0203 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/gtcp_server_client2.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "time" +) + +func main() { + // Server + go gtcp.NewServer("127.0.0.1:8999", func(conn *gtcp.Conn) { + defer conn.Close() + for { + data, err := conn.RecvPkg() + if err != nil { + fmt.Println(err) + break + } + fmt.Println("RecvPkg:", string(data)) + } + }).Run() + + time.Sleep(time.Second) + + // Client + conn, err := gtcp.NewConn("127.0.0.1:8999") + if err != nil { + panic(err) + } + defer conn.Close() + for i := 0; i < 10000; i++ { + if err := conn.SendPkg(nil); err != nil { + glog.Error(err) + } + time.Sleep(1*time.Second) + } +} diff --git a/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_client.go b/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_client.go new file mode 100644 index 000000000..f69a8e8ba --- /dev/null +++ b/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_client.go @@ -0,0 +1,44 @@ +package main + +import ( + "encoding/json" + "github.com/gogf/gf/g" + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "github.com/gogf/gf/g/os/gtime" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/monitor/types" +) + + + +func main() { + // 数据上报客户端 + conn, err := gtcp.NewConn("127.0.0.1:8999") + if err != nil { + panic(err) + } + defer conn.Close() + // 使用JSON格式化数据字段 + info, err := json.Marshal(types.NodeInfo{ + Cpu : float32(66.66), + Host : "localhost", + Ip : g.Map { + "etho" : "192.168.1.100", + "eth1" : "114.114.10.11", + }, + MemUsed : 15560320, + MemTotal : 16333788, + Time : int(gtime.Second()), + }) + if err != nil { + panic(err) + } + // 使用 SendRecvPkg 发送消息包并接受返回 + if result, err := conn.SendRecvPkg(info); err != nil { + if err.Error() == "EOF" { + glog.Println("server closed") + } + } else { + glog.Println(string(result)) + } +} diff --git a/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_server.go b/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_server.go new file mode 100644 index 000000000..e91f1b34b --- /dev/null +++ b/geg/net/gtcp/pkg_operations/monitor/gtcp_monitor_server.go @@ -0,0 +1,31 @@ +package main + +import ( + "encoding/json" + "github.com/gogf/gf/g/net/gtcp" + "github.com/gogf/gf/g/os/glog" + "github.com/gogf/gf/geg/net/gtcp/pkg_operations/monitor/types" +) + +func main() { + // 服务端,接收客户端数据并格式化为指定数据结构,打印 + gtcp.NewServer("127.0.0.1:8999", func(conn *gtcp.Conn) { + defer conn.Close() + for { + data, err := conn.RecvPkg() + if err != nil { + if err.Error() == "EOF" { + glog.Println("client closed") + } + break + } + info := &types.NodeInfo{} + if err := json.Unmarshal(data, info); err != nil { + glog.Errorfln("invalid package structure: %s", err.Error()) + } else { + glog.Println(info) + conn.SendPkg([]byte("ok")) + } + } + }).Run() +} diff --git a/geg/net/gtcp/pkg_operations/monitor/types/type.go b/geg/net/gtcp/pkg_operations/monitor/types/type.go new file mode 100644 index 000000000..680157d03 --- /dev/null +++ b/geg/net/gtcp/pkg_operations/monitor/types/type.go @@ -0,0 +1,12 @@ +package types + +import "github.com/gogf/gf/g" + +type NodeInfo struct { + Cpu float32 // CPU百分比(%) + Host string // 主机名称 + Ip g.Map // IP地址信息(可能多个) + MemUsed int // 内存使用(byte) + MemTotal int // 内存总量(byte) + Time int // 上报时间(时间戳) +}