package FLXNetworkController import ( "flx/Common" "fmt" "net" "strings" log "github.com/sirupsen/logrus" ) type FlxNetworkCmdTCPLisen struct { BufferMaxLength int //最大缓冲长度 SocketID string TCPConn net.Conn RecThreadIsWorking bool //是否开始接受 TCPWorking bool tmpRecDataBuffer []byte //缓冲字节 InvokeOnReviceData func(Compacket) //外部委托 } // func (para *FlxNetworkCmdTCPLisen) StartTCPListen() { // // 绑定监听地址 // var err error // para.TCPlistener, err = net.Listen("tcp", ":9667") // if err != nil { // log.Fatal(fmt.Sprintf("listen err: %v", err)) // } // defer para.TCPlistener.Close() // log.Println(fmt.Sprintln("bind:start listening...")) // for { // // Accept 会一直阻塞直到有新的连接建立或者listen中断才会返回 // conn, err := para.TCPlistener.Accept() // if err != nil { // // 通常是由于listener被关闭无法继续监听导致的错误 // log.Fatal(fmt.Sprintf("accept err: %v", err)) // } // // 开启新的 goroutine 处理该连接 // go para.Handle(conn) // } // } func (para *FlxNetworkCmdTCPLisen) Handle(conn net.Conn) { defer func() { if r := recover(); r != nil { log.Error("Handle:", r) } }() // defer conn.Close() para.SocketID = Common.GetGUID().Hex() para.TCPConn = conn for { var buf [65535]byte n, err := conn.Read(buf[:]) if err != nil { fmt.Println("Read from tcp server failed,err:", err) break } para.ProcessRecvBuff(buf[:n]) } } func (para *FlxNetworkCmdTCPLisen) ProcessRecvBuff(RecvBuffer []byte) { defer func() { if r := recover(); r != nil { log.Error("ProcessRecvBuff:", r) } }() startIndex := 0 curIndex := 0 length := 0 //判断是否大于14字节 for curIndex <= len(RecvBuffer)-7 { //判断是否出现 7E开头 if RecvBuffer[curIndex] == FlxNetworkComPara_CMD_HEAD { if RecvBuffer[curIndex+3] > 8 { //System.Windows.Forms.CMessageBox.Show("数据出错!"); curIndex++ continue } length = int(RecvBuffer[curIndex+3])*256 + int(RecvBuffer[curIndex+4]) + 7 if length <= len(RecvBuffer)-curIndex { para.ValidateRecvBuffer(length, RecvBuffer, curIndex) curIndex = curIndex + length startIndex = curIndex } else { para.tmpRecDataBuffer = append(para.tmpRecDataBuffer, RecvBuffer[curIndex:]...) startIndex = -1 } } else { curIndex++ } } if startIndex >= 0 && startIndex < len(RecvBuffer) { para.tmpRecDataBuffer = append(para.tmpRecDataBuffer, RecvBuffer[curIndex:]...) } } func (para *FlxNetworkCmdTCPLisen) ValidateRecvBuffer(packLen int, RecvBuffer []byte, startIndex int) bool { defer func() { if r := recover(); r != nil { log.Error("ValidateRecvBuffer:", r) } }() PackBuff := make([]byte, packLen) PackBuff = RecvBuffer[startIndex : startIndex+packLen] //校验CRC CRCBuff := CRCCheck12(PackBuff[:packLen-2]) if CRCBuff[0] != PackBuff[packLen-2] || CRCBuff[1] != PackBuff[packLen-1] { //InvokeOnDataReciveLogHandler(string.Format(FlxNetCCUConstantText.ReciveDataBufferImperfect_Error, "飞利信网口中控机")); //--写日志 return false } else { para.InvokeOnReviceData(CreatCMDPack(strings.Split(para.TCPConn.RemoteAddr().String(), ":")[0], PackBuff)) // para.InvokeOnReviceData(CreatCMDPack(PackBuff, packLen-2)) //外发事件。 return true } } func (para *FlxNetworkCmdTCPLisen) SendToClient(dataMsg []byte) { defer func() { if r := recover(); r != nil { log.Error("SendToClient:", r) } }() if dataMsg == nil { fmt.Printf("不能向远程端口发送空数据!") return } if len(dataMsg) < 5 { fmt.Printf("不能向远程端口发送不完整的数据5!") return } dataMsg = FullCheckSum(dataMsg) para.TCPConn.Write(dataMsg) } // 服务器发送结束会议指令 func (para *FlxNetworkCmdTCPLisen) StopAgenda() { defer func() { if r := recover(); r != nil { log.Error("StopAgenda:", r) } }() var ary = make([]byte, 7) ary[0] = FlxNetworkComPara_CMD_HEAD ary[1] = FlxNetworkComPara_Meeting //cmd ary[2] = FlxNetworkComPara_Meeting_Close para.SendToClient(ary) } // 服务器发送会议状态指令 func (para *FlxNetworkCmdTCPLisen) SendToClientCongresStatus(SoftStatus string) { defer func() { if r := recover(); r != nil { log.Error("SendToClientCongresStatus:", r) } }() sendValue := []byte(SoftStatus) slen := len(sendValue) + 7 var buff = make([]byte, slen) buff[0] = FlxNetworkComPara_CMD_HEAD buff[1] = FlxNetworkComPara_Server_Congress_Status buff[2] = FlxNetworkComPara_Server_RetStatus if len(sendValue) > 255 { buff[3] = (byte)(len(sendValue) / 255) buff[4] = (byte)(len(sendValue) % 255) } else { buff[4] = (byte)(len(sendValue)) } buff = insertSlice(5, sendValue, buff) para.SendToClient(buff) } // 服务器发送开始报到指令 func (para *FlxNetworkCmdTCPLisen) StartCheckInStart() { defer func() { if r := recover(); r != nil { log.Error("StartCheckInStart:", r) } }() var ary = make([]byte, 7) ary[0] = FlxNetworkComPara_CMD_HEAD ary[1] = FlxNetworkComPara_Main_Start_Register //cmd ary[2] = 0 para.SendToClient(ary) } // 服务器发送开始报到指令 func (para *FlxNetworkCmdTCPLisen) ServerSendToClientStartCheckIn(ClientIP string) { defer func() { if r := recover(); r != nil { log.Error("ServerSendToClientStartCheckIn:", r) } }() var ary = make([]byte, 7) ary[0] = FlxNetworkComPara_CMD_HEAD ary[1] = FlxNetworkComPara_Main_Start_Register //cmd ary[2] = 0 para.SendToClient(ary) } // 服务器发送结束报到指令 func (para *FlxNetworkCmdTCPLisen) StartCheckInStop() { defer func() { if r := recover(); r != nil { log.Error("StartCheckInStop:", r) } }() var ary = make([]byte, 7) ary[0] = FlxNetworkComPara_CMD_HEAD ary[1] = FlxNetworkComPara_Main_Stop_Register //cmd ary[2] = 0 para.SendToClient(ary) } // 服务器发送人员报到指令 func (para *FlxNetworkCmdTCPLisen) SendToClientPersonCheckIn(AP_ID string) { defer func() { if r := recover(); r != nil { log.Error("SendToClientPersonCheckIn:", r) } }() sendValue := []byte(AP_ID) slen := len(sendValue) + 7 var buff = make([]byte, slen) buff[0] = FlxNetworkComPara_CMD_HEAD buff[1] = FlxNetworkComPara_Un_Register buff[2] = FlxNetworkComPara_CheckIn_Sub_Signed if len(sendValue) > 255 { buff[3] = (byte)(len(sendValue) / 255) buff[4] = (byte)(len(sendValue) % 255) } else { buff[4] = (byte)(len(sendValue)) } buff = insertSlice(5, sendValue, buff) para.SendToClient(buff) } // 服务器发送人员消报指令 func (para *FlxNetworkCmdTCPLisen) SendToClientPersonCheckOut(AP_ID string) { defer func() { if r := recover(); r != nil { log.Error("SendToClientPersonCheckOut:", r) } }() sendValue := []byte(AP_ID) slen := len(sendValue) + 7 var buff = make([]byte, slen) buff[0] = FlxNetworkComPara_CMD_HEAD buff[1] = FlxNetworkComPara_Un_Register buff[2] = FlxNetworkComPara_CheckIn_Sub_Cancel if len(sendValue) > 255 { buff[3] = (byte)(len(sendValue) / 255) buff[4] = (byte)(len(sendValue) % 255) } else { buff[4] = (byte)(len(sendValue)) } buff = insertSlice(5, sendValue, buff) para.SendToClient(buff) }