101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
package tcppool
|
||
|
||
import (
|
||
"fmt"
|
||
"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.DialTimeout("tcp", "192.168.110.50:"+port, 10*time.Second)
|
||
if err == nil {
|
||
t.client = conn
|
||
t.watch(t.client)
|
||
}
|
||
})
|
||
return t
|
||
}
|
||
func (t *TcpHelper) reconnect(port string) {
|
||
var conn, err = net.Dial("tcp", "192.168.110.50:"+port)
|
||
if err == nil {
|
||
atomic.StoreInt32(t.Full, 0)
|
||
t.client = conn
|
||
t.watch(t.client)
|
||
}
|
||
}
|
||
func (t *TcpHelper) SendMsg(msg []byte) error {
|
||
msg = append(msg, '\n')
|
||
_, err := t.Init(config.GetConf().OrderPort).client.Write(msg)
|
||
var buffer [1]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.StoreInt32(t.Full, 1)
|
||
} else if recvStr == "2" {
|
||
fmt.Println("客户端空闲")
|
||
atomic.StoreInt32(t.Full, 0)
|
||
}
|
||
}
|
||
|
||
}
|
||
return err
|
||
}
|
||
func (t *TcpHelper) Close(conn net.Conn) {
|
||
t.client.Close()
|
||
}
|
||
func (t *TcpHelper) watch(conn net.Conn) {
|
||
go func() {
|
||
|
||
for {
|
||
fmt.Println("watch")
|
||
conn.SetWriteDeadline(time.Now().Add(time.Second * 3))
|
||
_, err := conn.Write([]byte("1"))
|
||
|
||
if err != nil {
|
||
utils.Log(nil, "连接关闭", err)
|
||
t.client.Close()
|
||
t.reconnect(config.GetConf().OrderPort)
|
||
return
|
||
} else {
|
||
var buffer [1]byte
|
||
// 持续读取数据
|
||
n, err := t.client.Read(buffer[:])
|
||
if err == nil && n > 0 {
|
||
recvStr := string(buffer[:n])
|
||
fmt.Println("结果:recvStr:", recvStr)
|
||
if recvStr == "1" {
|
||
fmt.Println("客户端繁忙")
|
||
atomic.StoreInt32(t.Full, 1)
|
||
} else if recvStr == "2" {
|
||
fmt.Println("客户端空闲")
|
||
atomic.StoreInt32(t.Full, 0)
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}()
|
||
}
|