package tcppool import ( "bufio" "fmt" "io" "net" "quenue/app/utils" "quenue/config" "sync" "sync/atomic" "time" ) var ( full int32 = 0 TcpFactory = TcpHelper{Full: &full} lockSingle sync.Once ) type TcpHelper struct { client net.Conn lastTime int64 Full *int32 } func (t *TcpHelper) Init(port string) *TcpHelper { lockSingle.Do(func() { var conn, err = net.Dial("tcp", "192.168.110.50:"+port) if err == nil { t.client = conn //t.watch(t.client) } }) return t } func (t *TcpHelper) handRead(conn net.Conn) { //defer func() { // if err := recover(); err != nil { // utils.Log(nil, "tcp read err", err) // } //}() for { if time.Now().Unix()-t.lastTime > 10 { //t.isDie = true //t.client.Close() //t.client = nil //return } fmt.Println("read") reader := bufio.NewReader(conn) var buffer [256]byte // 持续读取数据 n, err := reader.Read(buffer[:]) if err == io.EOF { continue } if err != nil { //if t.client != nil { // t.client.Close() // t.client = nil //} utils.Log(nil, "Error reading data:", err) continue } recvStr := string(buffer[:n]) if recvStr == "1" { atomic.AddInt32(t.Full, 1) } else if recvStr == "ping" { conn.Write([]byte("pong")) t.lastTime = time.Now().Unix() } } select {} } func (t *TcpHelper) SendMsg(msg []byte) error { _, err := t.Init(config.GetConf().OrderPort).client.Write(msg) var buffer [256]byte // 持续读取数据 n, err := t.client.Read(buffer[:]) if err == nil { if n > 0 { recvStr := string(buffer[:n]) fmt.Println("结果:recvStr:", recvStr) if recvStr == "1" { fmt.Println("满了") atomic.AddInt32(t.Full, 1) } else if recvStr == "2" { atomic.AddInt32(t.Full, -1) } } } return err } func (t *TcpHelper) Close(conn net.Conn) { t.client.Close() } func (t *TcpHelper) watch(conn net.Conn) { go t.handRead(conn) }