From f5652a5c9114b699fa475718d31a41e9b748a863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E6=B5=B7=E4=BB=B2=E5=AD=90?= Date: Mon, 29 Nov 2021 22:28:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=8E=A5=E6=94=B6=E5=8F=8A?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + main.go | 54 +++++++++++++++++++-------------------- model/packet-model.go | 6 +++++ service/client-service.go | 21 +++++++++++++++ service/data-service.go | 46 +++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 model/packet-model.go create mode 100644 service/client-service.go create mode 100644 service/data-service.go diff --git a/.gitignore b/.gitignore index ba336f8..74db0e3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ logs/ tcp-socket go.sum +.vscode/ \ No newline at end of file diff --git a/main.go b/main.go index 95adc5b..bccffb2 100644 --- a/main.go +++ b/main.go @@ -1,11 +1,11 @@ package main import ( - "fmt" "net" - "strings" "github.com/sirupsen/logrus" + "myschools.me/suguo/tcp-socket/model" + "myschools.me/suguo/tcp-socket/service" ) func main() { @@ -15,6 +15,9 @@ func main() { "func": "main", }).Fatalf("net.Listen: %s", err.Error()) } + defer srv.Close() + + go service.DataProcess() for { conn, err := srv.Accept() @@ -29,6 +32,11 @@ func main() { } func connHandler(c net.Conn) { + endpoint := c.RemoteAddr().String() + logrus.WithFields(logrus.Fields{ + "func": "main", + }).Infof("client is connected, %s", endpoint) + //1.conn是否有效 if c == nil { logrus.WithFields(logrus.Fields{ @@ -36,11 +44,19 @@ func connHandler(c net.Conn) { }).Warnf("srv.Accept: %s", "无效的conn") return } - //2.新建网络数据流存储结构 - buf := make([]byte, 4096) - //3.循环读取网络数据流 + defer func() { + if err := c.Close(); err != nil { + logrus.WithFields(logrus.Fields{ + "func": "main", + }).Debugf("c.Close: %s", err.Error()) + } + }() + + service.ClientSet(endpoint, c) + for { - //3.1 网络数据流读入 buffer + //2.新建网络数据流存储结构 + buf := make([]byte, 4096) cnt, err := c.Read(buf) //3.2 数据读尽、读取错误 关闭 socket 连接 if cnt == 0 || err != nil { @@ -48,27 +64,9 @@ func connHandler(c net.Conn) { break } - //3.3 根据输入流进行逻辑处理 - //buf数据 -> 去两端空格的string - inStr := strings.TrimSpace(string(buf[0:cnt])) - //去除 string 内部空格 - cInputs := strings.Split(inStr, " ") - //获取 客户端输入第一条命令 - fCommand := cInputs[0] - - fmt.Println("客户端传输->" + fCommand) - - switch fCommand { - case "ping": - c.Write([]byte("服务器端回复-> pong\n")) - case "hello": - c.Write([]byte("服务器端回复-> world\n")) - default: - c.Write([]byte("服务器端回复" + fCommand + "\n")) - } - - //c.Close() //关闭client端的连接,telnet 被强制关闭 - - fmt.Printf("来自 %v 的连接关闭\n", c.RemoteAddr()) + service.DataPush(&model.Packet{ + Endpoint: endpoint, + Data: buf[:cnt], + }) } } diff --git a/model/packet-model.go b/model/packet-model.go new file mode 100644 index 0000000..6d658aa --- /dev/null +++ b/model/packet-model.go @@ -0,0 +1,6 @@ +package model + +type Packet struct { + Endpoint string + Data []byte +} diff --git a/service/client-service.go b/service/client-service.go new file mode 100644 index 0000000..08faebe --- /dev/null +++ b/service/client-service.go @@ -0,0 +1,21 @@ +package service + +import "net" + +var _clients map[string]net.Conn + +func init() { + _clients = make(map[string]net.Conn) +} + +func ClientSet(endpoint string, conn net.Conn) { + _clients[endpoint] = conn +} + +func ClientGet(endpoint string) net.Conn { + conn := _clients[endpoint] + if conn == nil { + delete(_clients, endpoint) + } + return conn +} diff --git a/service/data-service.go b/service/data-service.go new file mode 100644 index 0000000..c2a42ae --- /dev/null +++ b/service/data-service.go @@ -0,0 +1,46 @@ +package service + +import ( + "fmt" + + "myschools.me/suguo/tcp-socket/model" +) + +var _data chan *model.Packet + +func init() { + _data = make(chan *model.Packet, 1024) +} + +func DataPush(packet *model.Packet) { + _data <- packet +} + +func DataProcess() { + for { + data := <-_data + fmt.Println(string(data.Data)) + switch string(data.Data[:1]) { + case "a": + go dataA((data)) + case "b": + go dataB((data)) + } + } +} + +func dataA(p *model.Packet) { + cc := ClientGet(p.Endpoint) + if cc == nil { + return + } + cc.Write([]byte("AAAAAAAAAA")) +} + +func dataB(p *model.Packet) { + cc := ClientGet(p.Endpoint) + if cc == nil { + return + } + cc.Write([]byte("BBBBBBBBBBBBB")) +}