示例#1
0
 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);
     }
 }
示例#2
0
 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);
            }
        }