101 lines
2.2 KiB
Go
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)
|
|
}
|