This commit is contained in:
邹宗楠
2026-05-12 16:30:39 +08:00
parent 35c8468789
commit 3cb53546f8
2 changed files with 74 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-print/globals"
"io"
"net"
"strings"
@@ -59,8 +60,17 @@ func handleConn(c net.Conn) error {
}
for {
buffer, n, err := ConnRead(c)
remoteAddr := c.RemoteAddr().(*net.TCPAddr)
remoteIP := remoteAddr.IP.String() // 打印机IP
remotePort := remoteAddr.Port // 打印机端口
globals.SugarLogger.Debugf("remoteIP1: %s", remoteIP)
globals.SugarLogger.Debugf("remotePort1: %d", remotePort)
printRemoteAddr := c.RemoteAddr().String()
printRemoteAddr = strings.Split(printRemoteAddr, ":")[0]
globals.SugarLogger.Debugf("printRemoteAddr2: %s", printRemoteAddr)
if err != nil {
if err == io.EOF {
fmt.Println("connection close")

View File

@@ -8,6 +8,7 @@ import (
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"log"
"net"
"regexp"
"strconv"
@@ -240,6 +241,11 @@ func (t *TcpClient) getPrintConn(key string) net.Conn {
return nil
}
}
func (t *TcpClient) setPrintConn(key string, c net.Conn) {
t.RLock()
defer t.RUnlock()
t.Clients[key].C = c
}
func (t *TcpClient) getPrintStatusTime(key string) time.Time {
t.RLock()
@@ -740,6 +746,23 @@ func doPrint(t *TcpClient, key string) (err error) {
return
}
// 链接已经关闭了
if isClosed(c) {
remoteAddr := c.RemoteAddr().(*net.TCPAddr)
remoteIP := remoteAddr.IP.String() // 打印机IP
remotePort := remoteAddr.Port // 打印机端口
globals.SugarLogger.Debugf("remoteIP3: %s", remoteIP)
globals.SugarLogger.Debugf("remotePort3: %d", remotePort)
printRemoteAddr := c.RemoteAddr().String()
printRemoteAddr = strings.Split(printRemoteAddr, ":")[0]
globals.SugarLogger.Debugf("printRemoteAddr3: %s", printRemoteAddr)
c = reconnectPrinter(c)
if c != nil {
t.setPrintConn(printMsg.PrintNo, c)
}
}
if _, err = c.Write(data); err != nil {
globals.SugarLogger.Debugf("handleTcpMessages err [%v]", err)
} else {
@@ -880,3 +903,44 @@ func (t *TcpClient) changePrintMsg(data string, orderNo int64, printNo string) (
}
return err
}
// 工具函数:判断连接是否关闭
func isClosed(conn net.Conn) bool {
buffer := make([]byte, 0)
// 设置读取超时=极短时间,不阻塞
conn.SetReadDeadline(time.Now().Add(1 * time.Millisecond))
_, err := conn.Read(buffer)
conn.SetReadDeadline(time.Time{}) // 重置超时
if err != nil {
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
return false // 只是超时,连接正常
}
}
return true // 连接已关闭
}
var mu sync.Mutex
// 自动重连
func reconnectPrinter(printerConn net.Conn) net.Conn {
mu.Lock()
defer mu.Unlock()
if printerConn != nil {
printerConn.Close()
}
// 重试 5 次
for i := 0; i < 5; i++ {
conn, err := net.DialTimeout("tcp", "打印机IP:端口", 3*time.Second)
if err == nil {
printerConn = conn
log.Println("打印机重连成功")
return printerConn
}
time.Sleep(2 * time.Second)
}
log.Println("打印机重连失败")
return nil
}