fix-reconnect

This commit is contained in:
MQjehovah 2024-09-24 00:08:53 +08:00
parent 3b95cf5645
commit 197718b418

View File

@ -26,6 +26,8 @@ import (
// 创建SESSION 03 00 00 00 // 创建SESSION 03 00 00 00
type Config struct { type Config struct {
DeviceId string DeviceId string
DeviceType string
DeviceDesc string
AddrServer string AddrServer string
} }
@ -73,13 +75,13 @@ func main() {
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.StringFlag{ &cli.StringFlag{
Name: "log", Name: "log",
Value: "log.txt", Value: "goproxy.log",
Usage: "log file path", Usage: "log file path",
}, },
&cli.StringFlag{ &cli.StringFlag{
Name: "conf", Name: "conf",
Aliases: []string{"c"}, Aliases: []string{"c"},
Value: "./rttys.conf", Value: "./goproxy.conf",
Usage: "config file to load", Usage: "config file to load",
}, },
&cli.StringFlag{ &cli.StringFlag{
@ -117,13 +119,7 @@ func main() {
} }
} }
func runClient(c *cli.Context) { func reConnect(dev *Device, cfg *Config) {
cfg := &Config{
DeviceId: "jmq",
AddrServer: "dev.xzrobot.com:9011",
}
tcpConn, err := createTcpConn(cfg.AddrServer) tcpConn, err := createTcpConn(cfg.AddrServer)
if err != nil { if err != nil {
fmt.Println("TCP Connect Error! " + err.Error()) fmt.Println("TCP Connect Error! " + err.Error())
@ -131,17 +127,8 @@ func runClient(c *cli.Context) {
} }
fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected") fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected")
dev := &Device{ dev.conn = tcpConn
id: cfg.DeviceId, dev.closed = 0
category: "device",
conn: tcpConn,
create_time: time.Now().Unix(),
active: time.Now(),
registered: false,
closed: 0,
send: make(chan []byte, 100),
sessions: make(map[string]*Session),
}
go dev.readLoop() go dev.readLoop()
go dev.writeLoop() go dev.writeLoop()
@ -151,8 +138,61 @@ func runClient(c *cli.Context) {
s[1] = []byte("desc") //desc s[1] = []byte("desc") //desc
s[2] = []byte("token") //token s[2] = []byte("token") //token
dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0})) dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0}))
}
func runClient(c *cli.Context) {
cfg := &Config{
DeviceId: "jmq",
DeviceType: "device",
DeviceDesc: "jmq",
AddrServer: "dev.xzrobot.com:9011",
}
for {
dev := &Device{
id: cfg.DeviceId,
category: cfg.DeviceType,
desc: cfg.DeviceDesc,
create_time: time.Now().Unix(),
active: time.Now(),
registered: false,
closed: 1,
send: make(chan []byte, 1024),
sessions: make(map[string]*Session),
}
// tcpConn, err := createTcpConn(cfg.AddrServer)
// if err != nil {
// fmt.Println("TCP Connect Error! " + err.Error())
// return
// }
// fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected")
// go dev.readLoop()
// go dev.writeLoop()
//registe
// s := make([][]byte, 3)
// s[0] = []byte("jmq") //id
// s[1] = []byte("desc") //desc
// s[2] = []byte("token") //token
// dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0}))
t := time.NewTicker(time.Second * 1)
for {
select {
case <-t.C:
if dev.closed == 1 {
reConnect(dev, cfg)
}
}
}
log.Info().Msgf("main loop exit")
}
select {}
} }
func (dev *Device) WriteMsg(typ int, data []byte) { func (dev *Device) WriteMsg(typ int, data []byte) {
@ -172,6 +212,7 @@ func (dev *Device) readLoop() {
if err != nil { if err != nil {
if err != io.EOF && !strings.Contains(err.Error(), "use of closed network connection") { if err != io.EOF && !strings.Contains(err.Error(), "use of closed network connection") {
log.Error().Msg(err.Error()) log.Error().Msg(err.Error())
dev.closed = 1
} }
return return
} }
@ -280,13 +321,13 @@ func (dev *Device) readLoop() {
log.Error().Msgf("invalid msg type: %d", msg_type) log.Error().Msgf("invalid msg type: %d", msg_type)
} }
} }
} }
func (dev *Device) writeLoop() { func (dev *Device) writeLoop() {
ticker := time.NewTicker(time.Second)
defer dev.conn.Close() defer dev.conn.Close()
defer log.Debug().Msgf("dev writeLoop finished")
ticker := time.NewTicker(time.Second)
ninactive := 0 ninactive := 0
lastHeartbeat := time.Now() lastHeartbeat := time.Now()
@ -301,6 +342,7 @@ func (dev *Device) writeLoop() {
_, err := dev.conn.Write(msg) _, err := dev.conn.Write(msg)
if err != nil { if err != nil {
log.Error().Msg(err.Error()) log.Error().Msg(err.Error())
dev.closed = 1
return return
} }
@ -314,6 +356,7 @@ func (dev *Device) writeLoop() {
log.Error().Msgf("Inactive device in long time: %s", dev.id) log.Error().Msgf("Inactive device in long time: %s", dev.id)
if ninactive > 3 { if ninactive > 3 {
log.Error().Msgf("Inactive 3 times, now kill it: %s", dev.id) log.Error().Msgf("Inactive 3 times, now kill it: %s", dev.id)
dev.closed = 1
return return
} }
ninactive = ninactive + 1 ninactive = ninactive + 1
@ -322,7 +365,7 @@ func (dev *Device) writeLoop() {
if now.Sub(lastHeartbeat) > HEART_BEAT_INTERVAL-1 { if now.Sub(lastHeartbeat) > HEART_BEAT_INTERVAL-1 {
lastHeartbeat = now lastHeartbeat = now
if len(dev.send) < 1 { if len(dev.send) < 1 {
// log.Info().Msgf("Send Heartbeat Time: %d", time.Now().Unix()) log.Info().Msgf("Transmit Heartbeat Time: %d", time.Now().Unix())
dev.WriteMsg(MSG_TYPE_HEARTBEAT, []byte{}) dev.WriteMsg(MSG_TYPE_HEARTBEAT, []byte{})
} }
} }