package main import ( "net" "github.com/sirupsen/logrus" "myschools.me/suguo/tcp-socket/model" "myschools.me/suguo/tcp-socket/service" ) func main() { srv, err := net.Listen("tcp", ":8087") if err != nil { logrus.WithFields(logrus.Fields{ "func": "main", }).Fatalf("net.Listen: %s", err.Error()) } defer srv.Close() go service.DataProcess() 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) { 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{ "func": "main", }).Warnf("srv.Accept: %s", "无效的conn") return } 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 { //2.新建网络数据流存储结构 buf := make([]byte, 4096) cnt, err := c.Read(buf) //3.2 数据读尽、读取错误 关闭 socket 连接 if cnt == 0 || err != nil { c.Close() break } service.DataPush(&model.Packet{ Endpoint: endpoint, Data: buf[:cnt], }) } }