From 5248d653fc27db1624291e3ef83f55eec8f544a3 Mon Sep 17 00:00:00 2001 From: "suguo.yao" Date: Sun, 28 Nov 2021 16:34:02 +0800 Subject: [PATCH] init --- .gitignore | 4 +++ go.mod | 7 ++++++ main.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 4 +++ 4 files changed, 89 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 main.go create mode 100644 readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba336f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.exe +logs/ +tcp-socket +go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3710fbb --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module myschools.me/suguo/tcp-socket + +go 1.17 + +require github.com/sirupsen/logrus v1.8.1 + +require golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect diff --git a/main.go b/main.go new file mode 100644 index 0000000..95adc5b --- /dev/null +++ b/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "fmt" + "net" + "strings" + + "github.com/sirupsen/logrus" +) + +func main() { + srv, err := net.Listen("tcp", ":8087") + if err != nil { + logrus.WithFields(logrus.Fields{ + "func": "main", + }).Fatalf("net.Listen: %s", err.Error()) + } + + for { + conn, err := srv.Accept() + if err != nil { + logrus.WithFields(logrus.Fields{ + "func": "main", + }).Warnf("srv.Accept: %s", err.Error()) + continue + } + go connHandler(conn) + } +} + +func connHandler(c net.Conn) { + //1.conn是否有效 + if c == nil { + logrus.WithFields(logrus.Fields{ + "func": "main", + }).Warnf("srv.Accept: %s", "无效的conn") + return + } + //2.新建网络数据流存储结构 + buf := make([]byte, 4096) + //3.循环读取网络数据流 + for { + //3.1 网络数据流读入 buffer + cnt, err := c.Read(buf) + //3.2 数据读尽、读取错误 关闭 socket 连接 + if cnt == 0 || err != nil { + c.Close() + 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()) + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..65e646d --- /dev/null +++ b/readme.md @@ -0,0 +1,4 @@ +net.socket例子 + +相关组件包: +https://github.com/newtools/zsocket \ No newline at end of file