fonchain-container/cmd/internal/embedded/implement/tcp/tcpServer.go
2024-07-02 11:56:53 +08:00

101 lines
2.2 KiB
Go

// Package tcp -----------------------------
// @file : tcpServer.go
// @author : JJXu
// @contact : wavingbear@163.com
// @time : 2024/5/21 上午11:21
// -------------------------------------------
package tcp
import (
"context"
"fmt"
"github.com/fonchain/fonchain-container/cmd/internal/embedded/implement/tcp/message"
"log"
"net"
"time"
)
var TcpServerIns *tcpServer
func InitTcpServer() {
TcpServerIns = &tcpServer{
clients: NewClientRoom(),
}
go TcpServerIns.Run()
go TcpServerIns.runAutoPing()
}
type tcpServer struct {
clients *ClientRoom
}
func (t *tcpServer) PingAllClient() {
for _, mchId := range t.clients.GetMchIdList() {
msg := fmt.Sprintf("002%s000ping", mchId)
err := t.clients.SendMsg(mchId, msg)
if err != nil {
log.Printf("ping failed: mchid:[%s] err:[%s]\n", mchId, err.Error())
continue
}
go t.clients.Reading(mchId)
}
}
func (t *tcpServer) Run() {
listener, err := net.Listen("tcp", ":8888")
if err != nil {
log.Fatal("TCP server failed to start: ", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Println("TCP server failed to accept connection: ", err)
return
}
//接收注册消息
timeoutCtx, _ := context.WithTimeout(context.Background(), time.Second*30)
go func() {
for {
select {
case <-timeoutCtx.Done():
conn.Close()
default:
var msg = make([]byte, 512)
_, connErr := conn.Read(msg)
if connErr != nil {
break
}
registerMsg := message.CommonType(msg)
if registerMsg.GetCmd() == "001" {
log.Printf("TCP 注册设备[%s] 时间:[%s]\n", registerMsg.GetMchId(), time.Now().Format("2006-01-02 15:04:05"))
t.clients.Save(registerMsg.GetMchId(), conn)
//var mchId = registerMsg.GetMchId()
//go t.clients.Reading(mchId)
return
} else {
fmt.Println("注册失败,未知命令")
}
}
}
}()
}
}
func (t *tcpServer) runAutoPing() {
ticker := time.NewTicker(time.Second * 30)
defer func() {
ticker.Stop()
}()
for {
select {
case <-ticker.C:
fmt.Println("auto ping. clients num:", len(t.clients.GetMchIdList()))
t.PingAllClient()
}
}
}
func (t *tcpServer) SendMsg(mchId, msg string) error {
return t.clients.SendMsg(mchId, msg)
}