package event import ( "encoding/hex" "errors" "fmt" "git.rosy.net.cn/jx-callback/business/model/dao" "io" "net" "strings" "time" ) // ConnRead 获取链接数据 func ConnRead(c net.Conn) ([]byte, int, error) { buffer := make([]byte, 1024*2) n, err := c.Read(buffer) return buffer, n, err } // ListenTcp 入口 func ListenTcp() { l, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen error:", err) return } for { c, err := l.Accept() if err != nil || c == nil { fmt.Println("accept error:", err) break } fn := func() { // 捕获异常 防止waitGroup阻塞 defer func() { if err := recover(); err != nil { fmt.Println("recover err = ", err) return } }() if err := handleConn(c); err != nil { c.Close() Pool.Wait() Pool.Stop() return } } Pool.AddJob(fn) } } func handleConn(c net.Conn) error { if c == nil { return errors.New("conn is nil") } for { buffer, n, err := ConnRead(c) printRemoteAddr := c.RemoteAddr().String() printRemoteAddr = strings.Split(printRemoteAddr, ":")[0] if err != nil { if err == io.EOF { fmt.Println("connection close") } else { fmt.Println("ReadString err:", err) } return err } //看是心跳还是打印回调 data := hex.EncodeToString(buffer[:n]) var ( printNo string = "" //打印机编号 heartbeat bool = false callback bool = false t *TcpClient = nil ) if strings.Contains(data, heartText) || strings.Contains(data, heartTextNew) { printNoData, _ := hex.DecodeString(data[len(heartText) : len(data)-8]) printNo = string(printNoData) heartbeat = true } else if strings.Contains(data, printText) || strings.Contains(data, printTextNew) { //打印回调 _, printNo = getCallbackMsgInfo(data) callback = true } if _, have := TcpClientList[printNo]; !have { t = NewTcpClient() TcpClientList[printNo] = t } else { t = TcpClientList[printNo] } if heartbeat { // 证明是心跳 Heartbeat(c, t, data, printNo, printRemoteAddr) } else if callback { // 打印回调 Callback(c, t, data, printNo) } } } func (t *TcpClient) printFail() (err error) { //新开机的打印失败和错误的 var ( db = dao.GetDB() ) prints, _ := dao.GetPrintMsgs(db, "", []int{printMsgFail, printMsgErr, PrintMsgAlreadyLoad, printMsgAlreadySend}, time.Now().Add(-time.Hour*3), time.Now(), 0, 999) for _, printMsg := range prints { t.addMsgChan(printMsg) } return err } func (t *TcpClient) readTimeoutMap(key string) bool { t.Lock() defer t.Unlock() return t.TimeoutMap[key] }