private void SendLoop() { while (true) { if (LoopKey) { if (File.Exists(@"X:\TAG.TXT")) { label_LoopStation.Text = "收到数据,开始处理..."; DateTime tempTime = DateTime.Now; StreamReader SR = new StreamReader(@"X:\TAG.TXT"); //读第一行 string TimeStr = SR.ReadLine(); while (!SR.EndOfStream) { //读下一行 string[] DataList = SR.ReadLine().Split(';'); if (DataList.Length > 0) { string[] StationInfo = DataList[0].Split(':'); int StationID = Convert.ToInt32(StationInfo[0]); int StationIndex = Convert.ToInt32(StationInfo[1]); for (int i = 1; i < DataList.Length; i++) { string[] TagInfo = DataList[i].Split(':'); DataRow tempRow = Protocol_Service.BasicPositionTable.NewRow(); tempRow["StationID"] = StationID; tempRow["CardID"] = Convert.ToInt32(TagInfo[0]); tempRow["RSSI"] = Convert.ToInt32(TagInfo[1]); //添加到定位临时运算表 Protocol_Service.BasicPositionTable.Rows.Add(tempRow); //底层的卡片定位信息数量自增 Protocol_Service.BasicNum_Position++; } } else { MessageBox.Show("格式错误"); } } //读完后就立即释放资源 SR.Close(); //开始处理数据。 try { //从本次巡检信息表(BasicPositionTable)中算出坐标并发出更新消息。如果到达历史存储时间间隔,则存入数据库。同时处理特殊区域与考勤 Protocol_Service.Do_DutyAndPosition(tempTime); ////如果进出洞字符串有人员,则发送消息 //if (Protocol_Service.InOutStr != "") //{ // //防止上面发送定位信息或者采集器时抢占通道的等待时间 // Thread.Sleep(200); // Socket_Service.BroadcastMessage(Socket_Service.Command_S2C_InOutMine, Protocol_Service.InOutStr.Substring(0, Protocol_Service.InOutStr.Length - 1) + "。", tempTime.TimeOfDay.ToString(), "", "", "", "", "", "",""); // Protocol_Service.InOutStr = ""; //} } catch (Exception ex) { if (Global.IsShowBug) { System.Windows.Forms.MessageBox.Show(ex.Message + "\n" + ex.TargetSite + "\n" + ex.StackTrace, "服务器巡检中处理错误时的错误"); } /*如果处理数据时错误,则继续巡检*/ } //删除文件 File.Delete(@"X:\TAG.TXT"); } label_LoopStation.Text = "空闲..."; } Thread.Sleep(Global.LoopTime); } }
private void btn_Start_Click(object sender, EventArgs e) { if (btn_Start.Text == "启动服务器") { try { //刷新硬件配置参数 if (CommonFun.RefreshHardConfig()) { //检查并更新数据库 DB_Service.CheckDBAndUpdate(); //初始化5个常用表 BasicData.InitALLTable(); //初始化定位信息表和数据采集表中最后一条记录的时间 if (DB_Service.InitLastInsertHistory_Position()) { //监听本地端口 Socket_Service.StartListenConnectOfClient(Global.ServerPort); //连接完毕,锁定UI UI_OnConn(); //开始轮询前删除底层数据区文件,不存在不引发异常 File.Delete(@"X:\TAG.TXT"); //从上次的临时数据文件重载Protocol_Service.Position的数据 CommonFun.ReloadPositionFromFile(); //开始循环轮询 LoopKey = true; //发送服务器状态 Socket_Service.BroadcastMessage(Socket_Service.Command_S2C_UpdatePosition, "True", "", "", "", Protocol_Service.AlarmAreaName + "!0!False", "False", "False", "False", "!"); } else { MessageBox.Show("无法取得定位信息历史表或采集信息历史表中最新的时间。请检查数据库连接是否正常后重试。", "连接数据库"); } } } catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.TargetSite + "\n" + ex.StackTrace, "启动服务器异常"); //关闭循环轮询 LoopKey = false; //恢复协议类变量为初始值 Protocol_Service.ResumeALL(); //清空所有表 BasicData.DisableALLTable(); //连接关闭,解锁UI UI_OffConn(); } } else { //关闭循环轮询 LoopKey = false; //发送服务器状态 Socket_Service.BroadcastMessage(Socket_Service.Command_S2C_UpdatePosition, "False", "", "", "", Protocol_Service.AlarmAreaName + "!0!False", "False", "False", "False", "!"); //停止监听 Socket_Service.StopListenConnectOfClient(); //恢复协议类变量为初始值 Protocol_Service.ResumeALL(); //清空所有表 BasicData.DisableALLTable(); //连接关闭,解锁UI UI_OffConn(); } }
/// <summary> /// 客户端消息分析 /// </summary> /// <param name="socket"></param> private static void AnalysisData(object socket) { try { Socket clientSocket = (Socket)socket; bool key = true; while (key) { byte[] buffer = new byte[BufferSize]; int bytes = clientSocket.Receive(buffer); if (bytes == 0) { continue; } try { string[] TempStrs = Encoding.Unicode.GetString(buffer, 0, bytes).Split('|'); string Command = ""; string Parameter1 = ""; string Parameter2 = ""; string Parameter3 = ""; string Parameter4 = ""; string Parameter5 = ""; string Parameter6 = ""; string Parameter7 = ""; string Parameter8 = ""; string Parameter9 = ""; //解析出命令字、命令参数 switch (TempStrs.Length) { case 1: Command = TempStrs[0]; break; case 2: Command = TempStrs[0]; Parameter1 = TempStrs[1]; break; case 3: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; break; case 4: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; break; case 5: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; break; case 6: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; Parameter5 = TempStrs[5]; break; case 7: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; Parameter5 = TempStrs[5]; Parameter6 = TempStrs[6]; break; case 8: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; Parameter5 = TempStrs[5]; Parameter6 = TempStrs[6]; Parameter7 = TempStrs[7]; break; case 9: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; Parameter5 = TempStrs[5]; Parameter6 = TempStrs[6]; Parameter7 = TempStrs[7]; Parameter8 = TempStrs[8]; break; case 10: Command = TempStrs[0]; Parameter1 = TempStrs[1]; Parameter2 = TempStrs[2]; Parameter3 = TempStrs[3]; Parameter4 = TempStrs[4]; Parameter5 = TempStrs[5]; Parameter6 = TempStrs[6]; Parameter7 = TempStrs[7]; Parameter8 = TempStrs[8]; Parameter9 = TempStrs[9]; break; } switch (Command) { case Command_C2S_Reg: switch (mainform.CheckLogName(Parameter1)) { case 0: mainform.AddClientList(Parameter1, ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString(), ((IPEndPoint)clientSocket.RemoteEndPoint).Port, DateTime.Now.ToString()); //返回登录成功 clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_Reg + "|0|" + DateTime.Now.ToString() + "|" + Global.IsUseHongWai.ToString() + "|" + Global.IsTempVersion.ToString())); try { htusertick.Add(Parameter1, 0); //记录用户对应的socket htusersocket.Add(Parameter1, clientSocket); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } break; case 1: //返回登录失败:人数达到最大限额 clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_Reg + "|1")); break; case 2: //返回登录失败:用户已经登录 object[] keyarray = new Object[htusersocket.Keys.Count]; Socket_Service.htusertick.Keys.CopyTo(keyarray, 0); string clientip = string.Empty; foreach (object obj in keyarray) { if (obj.ToString() == Parameter1) { Socket sc = (Socket)htusersocket[obj]; if (sc.Connected) //该账户的客户端连接正常 { IPEndPoint endpoint = (IPEndPoint)sc.RemoteEndPoint; clientip = endpoint.Address.ToString(); } else { clientip = "该账户连接正在断开请稍后"; } } } clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_Reg + "|2" + "|" + clientip)); break; } break; case Command_C2S_ConnTick: //收到心跳消息则复位该用户心跳值为0 if (htusertick.Contains(Parameter1)) { htusertick[Parameter1] = 0; System.Net.Sockets.Socket tempsocket = (System.Net.Sockets.Socket)socket; System.Net.IPEndPoint tempendpoint = (System.Net.IPEndPoint)tempsocket.RemoteEndPoint; Console.WriteLine(tempendpoint.Address.ToString() + "--" + tempendpoint.Port.ToString() + "清0"); } Console.WriteLine("清0"); break; case Command_C2S_UnReg: key = false; mainform.RefreshClientList(ClientList); lock (htusersocket) { if (htusersocket.Contains(Parameter1)) { htusersocket.Remove(Parameter1); } } lock (htusertick) { if (htusertick.Contains(Parameter1)) { htusertick.Remove(Parameter1); } } break; case Command_C2S_AddRelation: int father = Convert.ToInt32(Parameter1); int son = Convert.ToInt32(Parameter2); //发送设置子基站命令 Socket_Service.mainform.hardChannel.Send(CommandFactory.GetAddSonCommand(father, son)); break; case Command_C2S_DelRelation: int fatherDelSon = Convert.ToInt32(Parameter1); int sonDelSon = Convert.ToInt32(Parameter2); //发送删除子基站命令 Socket_Service.mainform.hardChannel.Send(CommandFactory.GetDelSonCommand(fatherDelSon, sonDelSon)); break; case Command_C2S_DownMessage: int cardID = Convert.ToInt32(Parameter1); int messageType = Convert.ToInt32(Parameter2); //根据连接方式发送短信 if (mainform.hardChannel.GetType() == Type.GetType("PersonPositionServer.Model.TcpSocket_Service")) { //网口:给所有网关基站一个一个的发 System.Data.DataRow[] rows = BasicData.GetStationTableRows("StationType = '网关基站'", true); for (int i = 0; i < rows.Length; i++) { try { int stationID = Convert.ToInt32(rows[i]["ID"]); Socket_Service.mainform.hardChannel.Send(CommandFactory.GetDownMessageCommand(stationID, cardID, messageType)); } catch (Exception ex) { if (Global.IsShowBug) { System.Windows.Forms.MessageBox.Show(ex.Message + "\n" + ex.TargetSite + "\n" + ex.StackTrace, "服务器下发短信错误"); } } } } else { //串口:给Can总线群发 Socket_Service.mainform.hardChannel.Send(CommandFactory.GetDownMessageCommand(1023, cardID, messageType)); //这里的1023是0x:03FF 是Can总线中的广播地址 } break; case Command_C2S_RequestDownMesType: //给客户端发送下行短信类型 clientSocket.Send(Encoding.Unicode.GetBytes(Command_S2C_DownMesType + "|" + Global.DownM0 + "=" + Global.DownM1 + "=" + Global.DownM2 + "=" + Global.DownM3 + "=" + Global.DownM4 + "=" + Global.DownM5 + "=" + Global.DownM6 + "=" + Global.DownM7 + "=" + Global.DownM8 + "=" + Global.DownM9 + "=" + Global.DownM10 + "=" + Global.DownM11)); break; case Command_C2S_RequestInArea: //给客户端发送特殊区域内人员 clientSocket.Send(Encoding.Unicode.GetBytes(Command_S2C_InArea + "|" + Protocol_Service.InArea.Count.ToString() + "|" + Protocol_Service.GetPresentInAreaStr())); break; case Command_C2S_LightUp: //发送点亮灯命令 if (Socket_Service.mainform.hardChannel.Send_Safe(Protocol_Service.CommandType.LightUp, CommandFactory.GetLightUpCommand(Convert.ToInt32(Parameter1), Convert.ToInt32(Parameter2)))) { //返回点亮灯成功 clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_LightUp)); } break; case Command_C2S_HandCheckOut: //强制离开指定的员工 if (Protocol_Service.HandCheckOut(Convert.ToInt32(Parameter1))) { //返回强制离开成功 clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_HandCheckOut)); } break; case Command_C2S_UpdateDB: Dictionary <string, string> ParameterList = new Dictionary <string, string>(); ParameterList.Add(Parameter1, Parameter1); if (Parameter2 != "") { ParameterList.Add(Parameter2, Parameter2); if (Parameter3 != "") { ParameterList.Add(Parameter3, Parameter3); if (Parameter4 != "") { ParameterList.Add(Parameter4, Parameter4); if (Parameter5 != "") { ParameterList.Add(Parameter5, Parameter5); if (Parameter6 != "") { ParameterList.Add(Parameter6, Parameter6); if (Parameter7 != "") { ParameterList.Add(Parameter7, Parameter7); if (Parameter8 != "") { ParameterList.Add(Parameter8, Parameter8); if (Parameter9 != "") { ParameterList.Add(Parameter9, Parameter9); } } } } } } } } if (ParameterList.ContainsKey("CardTable")) { BasicData.RefreshCardTable(); } if (ParameterList.ContainsKey("CollectChannelTable")) { BasicData.RefreshCollectChannelTable(); } if (ParameterList.ContainsKey("PersonTable")) { BasicData.RefreshPersonTable(); } if (ParameterList.ContainsKey("SpecalTable")) { BasicData.RefreshSpecalTable(); } if (ParameterList.ContainsKey("StationTable")) { BasicData.RefreshStationTable(); } //给除这个客户端以外的所有客户端发送数据库更新消息 BroadcastMessageWithOutOne(clientSocket, Socket_Service.Command_S2C_UpdateDB, Parameter1, Parameter2, Parameter3, Parameter4, Parameter5, Parameter6, Parameter7, Parameter8, Parameter9); break; case Command_C2S_AreaSubject: //返回命令成功 clientSocket.Send(Encoding.Unicode.GetBytes(RES_S2C_AreaSubject)); switch (Parameter1) { case "ON": Protocol_Service.AlarmAreaName = Parameter2; break; case "OFF": Protocol_Service.AlarmAreaName = "未启动"; Protocol_Service.InArea.Clear(); Protocol_Service.IsExceedInArea = false; break; case "CHANGE": Protocol_Service.AlarmAreaName = Parameter2; break; } break; case Command_C2S_SetInfo: Socket_Service.mainform.hardChannel.Send(CommandFactory.GetSetInfoCommand(Convert.ToInt32(Parameter1), Convert.ToByte(Parameter2), Convert.ToByte(Parameter3), Parameter4)); break; } } catch (Exception ex) { if (Global.IsShowBug) { System.Windows.Forms.MessageBox.Show(ex.Message + "\n" + ex.TargetSite + "\n" + ex.StackTrace, "服务器解析客户端命令错误"); } //在解析命令时如果有错,则忽略 } } ClientList.Remove(socket); clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); mainform.RefreshClientList(ClientList); } catch { ClientList.Remove(socket); //在htlcientsock和htusertick中清除该socket object[] keyarray = new Object[htusersocket.Keys.Count]; Socket_Service.htusertick.Keys.CopyTo(keyarray, 0); System.Net.Sockets.Socket csocket = (System.Net.Sockets.Socket)socket; if (csocket.Connected && csocket != null)//远程主机未强制关闭 { System.Net.IPEndPoint cendpoint = (System.Net.IPEndPoint)csocket.RemoteEndPoint; foreach (object obj in keyarray) { System.Net.Sockets.Socket htsocket = (System.Net.Sockets.Socket)htusersocket[obj]; System.Net.IPEndPoint htendPoint = (System.Net.IPEndPoint)htsocket.RemoteEndPoint; if ((htendPoint.Address.ToString() == cendpoint.Address.ToString()) && (htendPoint.Port == cendpoint.Port)) { //先关闭连接再移除 htsocket.Shutdown(SocketShutdown.Both); htsocket.Close(); htusersocket.Remove(obj); htusertick.Remove(obj); } } } else//远程主机已强制关闭 { foreach (object obj in keyarray) { System.Net.Sockets.Socket htsocket = (System.Net.Sockets.Socket)htusersocket[obj]; if (!htsocket.Connected && htsocket != null) { htsocket.Shutdown(SocketShutdown.Both); htsocket.Close(); htusersocket.Remove(obj); htusertick.Remove(obj); } } } mainform.RefreshClientList(ClientList); } }