using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Threading; using System.IO; using System.Drawing; using System.Collections; using irisHelper; using irisDataBase; using IrisDoor; using irisRefactor.FrmService; using System.Windows.Forms; namespace irisRefactor.IrisScoket { class SocketHelper { public static Socket serverSocket; private static Socket clientSocket; private List<Socket> allClientSocket = new List<Socket>(); private List<string> allClientIp = new List<string>();//存储客户端IP private static string dataFromOffline = ""; private static string dataFromServer = ""; private static int updatePermissionResult = 0; public void start() { IPAddress ip = IPAddress.Parse(IPAddress.Any.ToString());//set ip int port = Convert.ToInt32(ProMemory.appConfig.DbServerConfig.ListenPort); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//initialize serverSocket.Bind(new IPEndPoint(ip, port));//bind serverSocket.Listen(10); //开启一个线程来监听客户端连接 Thread myThread = new Thread(ListenClientConnect); myThread.IsBackground = true; myThread.Start(); //进入监听状态 LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "开始监听..." + port); } private void ListenClientConnect() { while (true) { //Client连接上后 得到这个连接 clientSocket = serverSocket.Accept(); IPAddress remote_ip = ((IPEndPoint)clientSocket.RemoteEndPoint).Address; int portal = ((IPEndPoint)clientSocket.RemoteEndPoint).Port; allClientSocket.Add(clientSocket); allClientIp.Add(remote_ip.ToString() + ":" + portal.ToString()); //开个线程接收Client信息 Thread receivedThread = new Thread(ReceiveMessage); //allClientThread.Add(receivedThread); receivedThread.Start(clientSocket); } } private void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; int length = 0; byte[] buffer = new byte[1024]; MemoryStream ms = new MemoryStream(); try { while ((length = myClientSocket.Receive(buffer)) > 0) { ms.Write(buffer, 0, length); } ms.Flush(); byte[] result = ms.ToArray(); string msg = Encoding.UTF8.GetString(result, 0, result.Length); if (msg == "open") { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到后台的开门指令..."); //启用门禁功能 if (ConfigHelper.GetAppConfig("doorSystemEnable") == "true") { DoorSystem.open(); } } else if (msg == "update") { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到后台的数据库更新指令..."); ProMemory.isSyning = true; if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.LimeGreen; Form1.GetInstance().label6.Text = "正在更新数据库,请稍候..."; Form1.GetInstance().ReInitializeToSleep(); } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.LimeGreen; Form2.GetInstance().label6.Text = "正在更新数据库,请稍候..."; Form2.GetInstance().ReInitializeToSleep(); } //数据下发强制待机 //ProMemory.cameraController.ContinuousShot_TriggerOn(); //开启线程,同步数据库 Thread updateThread = new Thread(updateDatabase); updateThread.Name = "syncScoket"; updateThread.IsBackground = true; updateThread.Start(); } // 离线采集发来清空命令 else if (msg.Contains("clear from offline")) { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到离线采集端清空命令..."); int re = -1; try { re = DatabaseLocal.OpenDB(ProMemory.appConfig.DbLocalConfig); if (re == 0) { re = ProMemory.irisSynchDataService.clearTableFromOffline();//清空数据库 } ProMemory.proConfig.CodeListMgr.CreateList(ProMemory.irisDataService.getAllIrisCodeLocal());//加载匹配列表 DatabaseLocal.CloseDB(); } catch (Exception e) { re = -1; LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库清空失败" + e.Message); } } else if (msg.Contains("data from offline")) { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到离线采集端的数据..."); dataFromOffline = msg.Replace("data from offline", ""); ProMemory.isSyning = true; if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.LimeGreen; Form1.GetInstance().label6.Text = "更新数据库中,请稍候..."; Form1.GetInstance().ReInitializeToSleep(); } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.LimeGreen; Form2.GetInstance().label6.Text = "更新数据库中,请稍候..."; Form2.GetInstance().ReInitializeToSleep(); } //数据下发强制待机 //ProMemory.cameraController.ContinuousShot_TriggerOn(); //开启线程,同步数据库 Thread updateThread = new Thread(updateDatabaseFromOffline); updateThread.Name = "syncScoketFromOffline"; updateThread.IsBackground = true; updateThread.Start(); } else if (msg.Contains("addPerson:")) { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到后台的新增人员数据..."); dataFromServer = msg; ProMemory.isSyning = true; if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.LimeGreen; Form1.GetInstance().label6.Text = "更新数据库中,请稍候..."; Form1.GetInstance().ReInitializeToSleep(); } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.LimeGreen; Form2.GetInstance().label6.Text = "更新数据库中,请稍候..."; Form2.GetInstance().ReInitializeToSleep(); } //开启线程,同步数据库 Thread updateThread = new Thread(updateDatabaseFromServer); updateThread.Name = "syncScoketFromServer"; updateThread.IsBackground = true; updateThread.Start(); } else if (msg.Contains("addPermission:") || msg.Contains("deletePermission:")) { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "接收到后台的更新授权数据..."); dataFromServer = msg; //ProMemory.isSyning = true; //if (ProMemory.formType == "1") //{ // Form1.GetInstance().panel1.Visible = true; // Form1.GetInstance().label6.ForeColor = Color.LimeGreen; // Form1.GetInstance().label6.Text = "更新数据库中,请稍候..."; // Form1.GetInstance().ReInitializeToSleep(); //} //else if (ProMemory.formType == "2") //{ // Form2.GetInstance().panel1.Visible = true; // Form2.GetInstance().label6.ForeColor = Color.LimeGreen; // Form2.GetInstance().label6.Text = "更新数据库中,请稍候..."; // Form2.GetInstance().ReInitializeToSleep(); //} //同步数据库 updateDatabaseFromServer(); if (updatePermissionResult != 0) { myClientSocket.Send(Encoding.ASCII.GetBytes("fail")); return; } } Byte[] sendMsg = Encoding.ASCII.GetBytes("ok"); myClientSocket.Send(sendMsg); } catch (Exception ex) { Console.WriteLine(ex.Message); myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); } myClientSocket.Close(); } //从服务器同步数据库 public static void updateDatabase() { int re = -1; string resultString = ""; try { re = DatabaseServer.OpenDB(ProMemory.appConfig.DbServerConfig); if (re == 0) { re = DatabaseLocal.OpenDB(ProMemory.appConfig.DbLocalConfig); if (re == 0) { re = ProMemory.irisSynchDataService.updateTable(ref resultString); } } ProMemory.proConfig.CodeListMgr.CreateList(ProMemory.irisDataService.getAllIrisCodeLocal());//加载匹配列表 DatabaseServer.CloseDB(); DatabaseLocal.CloseDB(); } catch (Exception e) { re = -1; resultString = "fail"; LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "updateDatabase 数据库同步失败" + e.Message); } finally { try { string serverIp = ProMemory.appConfig.DbServerConfig.ServerIp; string serverAppPort = ProMemory.appConfig.DbServerConfig.ServerAppPort; Http("http://" + serverIp + ":" + serverAppPort + "/device/receiveMsg?msg=" + resultString, null, null); LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "回调信息:" + "http://" + serverIp + ":" + serverAppPort + "/device/receiveMsg?msg=" + resultString); } catch (Exception e) { LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "通知服务器数据库同步结果失败:" + e.Message); } finally { if (re == 0) { if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.LimeGreen; Form1.GetInstance().label6.Text = "数据库更新成功!"; } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.LimeGreen; Form2.GetInstance().label6.Text = "数据库更新成功!"; } LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库同步成功"); new Thread(new ThreadStart(() => { Thread.Sleep(3000); if (ProMemory.formType == "1") Form1.GetInstance().panel1.Visible = false; else if (ProMemory.formType == "2") Form2.GetInstance().panel1.Visible = false; ProMemory.isSyning = false; if (ProMemory.isWait) ProMemory.cameraController.ContinuousShot_TriggerOn(); else ProMemory.cameraController.ContinuousShot_TriggerOff(); })).Start(); } else { if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.OrangeRed; Form1.GetInstance().label6.Text = "数据库更新失败!"; } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.OrangeRed; Form2.GetInstance().label6.Text = "数据库更新失败!"; } new Thread(new ThreadStart(() => { Thread.Sleep(3000); if (ProMemory.formType == "1") Form1.GetInstance().panel1.Visible = false; else if (ProMemory.formType == "2") Form2.GetInstance().panel1.Visible = false; ProMemory.isSyning = false; if (ProMemory.isWait) ProMemory.cameraController.ContinuousShot_TriggerOn(); else ProMemory.cameraController.ContinuousShot_TriggerOff(); })).Start(); LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库同步失败"); } } } } // 接收到离线采集端的数据,存入数据库 public static void updateDatabaseFromOffline() { int re = -1; try { re = DatabaseLocal.OpenDB(ProMemory.appConfig.DbLocalConfig); if (re == 0) { re = ProMemory.irisSynchDataService.updateTableFromOffline(dataFromOffline); dataFromOffline = ""; } ProMemory.proConfig.CodeListMgr.CreateList(ProMemory.irisDataService.getAllIrisCodeLocal());//加载匹配列表 DatabaseLocal.CloseDB(); } catch (Exception e) { re = -1; LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "updateDatabase 数据库同步失败" + e.Message); } finally { if (re == 0) { if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.LimeGreen; Form1.GetInstance().label6.Text = "数据库更新成功!"; } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.LimeGreen; Form2.GetInstance().label6.Text = "数据库更新成功!"; } LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库更新成功"); new Thread(new ThreadStart(() => { Thread.Sleep(3000); if (ProMemory.formType == "1") Form1.GetInstance().panel1.Visible = false; else if (ProMemory.formType == "2") Form2.GetInstance().panel1.Visible = false; ProMemory.isSyning = false; if (ProMemory.isWait) ProMemory.cameraController.ContinuousShot_TriggerOn(); else ProMemory.cameraController.ContinuousShot_TriggerOff(); })).Start(); } else { if (ProMemory.formType == "1") { Form1.GetInstance().panel1.Visible = true; Form1.GetInstance().label6.ForeColor = Color.OrangeRed; Form1.GetInstance().label6.Text = "数据库更新失败!"; } else if (ProMemory.formType == "2") { Form2.GetInstance().panel1.Visible = true; Form2.GetInstance().label6.ForeColor = Color.OrangeRed; Form2.GetInstance().label6.Text = "数据库更新失败!"; } new Thread(new ThreadStart(() => { Thread.Sleep(3000); if (ProMemory.formType == "1") Form1.GetInstance().panel1.Visible = false; else if (ProMemory.formType == "2") Form2.GetInstance().panel1.Visible = false; ProMemory.isSyning = false; if (ProMemory.isWait) ProMemory.cameraController.ContinuousShot_TriggerOn(); else ProMemory.cameraController.ContinuousShot_TriggerOff(); })).Start(); LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库更新失败"); } } } //接收到后台的更新数据 public static void updateDatabaseFromServer() { int re = -1; try { re = DatabaseLocal.OpenDB(ProMemory.appConfig.DbLocalConfig); if (re == 0) { re = ProMemory.irisSynchDataService.updateTableFromServer(dataFromServer); dataFromServer = ""; } ProMemory.proConfig.CodeListMgr.CreateList(ProMemory.irisDataService.getAllIrisCodeLocal());//加载匹配列表 DatabaseLocal.CloseDB(); } catch (Exception e) { re = -1; LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "updateDatabase 数据库同步失败" + e.Message); } finally { if (re == 0) { //if (ProMemory.formType == "1") //{ // Form1.GetInstance().panel1.Visible = true; // Form1.GetInstance().label6.ForeColor = Color.LimeGreen; // Form1.GetInstance().label6.Text = "数据库更新成功!"; //} //else if (ProMemory.formType == "2") //{ // Form2.GetInstance().panel1.Visible = true; // Form2.GetInstance().label6.ForeColor = Color.LimeGreen; // Form2.GetInstance().label6.Text = "数据库更新成功!"; //} LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库更新成功"); //new Thread(new ThreadStart(() => //{ // Thread.Sleep(3000); // if (ProMemory.formType == "1") // Form1.GetInstance().panel1.Visible = false; // else if (ProMemory.formType == "2") // Form2.GetInstance().panel1.Visible = false; // ProMemory.isSyning = false; // if (ProMemory.isWait) // ProMemory.cameraController.ContinuousShot_TriggerOn(); // else // ProMemory.cameraController.ContinuousShot_TriggerOff(); //})).Start(); } else { //if (ProMemory.formType == "1") //{ // Form1.GetInstance().panel1.Visible = true; // Form1.GetInstance().label6.ForeColor = Color.OrangeRed; // Form1.GetInstance().label6.Text = "数据库更新失败!"; //} //else if (ProMemory.formType == "2") //{ // Form2.GetInstance().panel1.Visible = true; // Form2.GetInstance().label6.ForeColor = Color.OrangeRed; // Form2.GetInstance().label6.Text = "数据库更新失败!"; //} //new Thread(new ThreadStart(() => //{ // Thread.Sleep(3000); // if (ProMemory.formType == "1") // Form1.GetInstance().panel1.Visible = false; // else if (ProMemory.formType == "2") // Form2.GetInstance().panel1.Visible = false; // ProMemory.isSyning = false; // if (ProMemory.isWait) // ProMemory.cameraController.ContinuousShot_TriggerOn(); // else // ProMemory.cameraController.ContinuousShot_TriggerOff(); //})).Start(); LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "数据库更新失败"); } updatePermissionResult = re; } } /// <summary> /// 不做catch处理,需要在外部做 /// </summary> /// <param name="url"></param> /// <param name="method">默认GET,空则补充为GET</param> /// <param name="contenttype">默认json,空则补充为json</param> /// <param name="header">请求头部</param> /// <param name="data">请求body内容</param> /// <returns></returns> public static void Http(string url, Hashtable header = null, string data = null) { string contenttype = "application/json;charset=utf-8"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = string.IsNullOrEmpty(contenttype) ? "application/json;charset=utf-8" : contenttype; if (header != null) { foreach (var i in header.Keys) { request.Headers.Add(i.ToString(), header[i].ToString()); } } if (!string.IsNullOrEmpty(data)) { Stream RequestStream = request.GetRequestStream(); byte[] bytes = Encoding.UTF8.GetBytes(data); RequestStream.Write(bytes, 0, bytes.Length); RequestStream.Close(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream ResponseStream = response.GetResponseStream(); StreamReader StreamReader = new StreamReader(ResponseStream, Encoding.GetEncoding("utf-8")); string re = StreamReader.ReadToEnd(); StreamReader.Close(); ResponseStream.Close(); } } }