|  |  |  |  | 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) | 
					
						
							|  |  |  |  | } |