This commit is contained in:
suguo.yao 2021-11-28 16:34:02 +08:00
commit 5248d653fc
4 changed files with 89 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*.exe
logs/
tcp-socket
go.sum

7
go.mod Normal file
View File

@ -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

74
main.go Normal file
View File

@ -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())
}
}

4
readme.md Normal file
View File

@ -0,0 +1,4 @@
net.socket例子
相关组件包:
https://github.com/newtools/zsocket