// Запуск мониторинга private void m_RunMonitoring_Click(object sender, EventArgs e) { if (b_Connect && (m_Monitoring == null || (m_Monitoring != null && !m_Monitoring.GetRun))) { // Создание потока и передача ему параметров m_Monitoring = new Monitoring(k_Base, d_InputTable, d_OutputTable); m_Monitoring.RunMonitoring(); } }
// Основной метод private void MainMethod() { try { CancellationToken c_Token = c_TokenCancel.Token; // Установка для сокета локальной конечной точки IPHostEntry i_IpHost = Dns.GetHostEntry("localhost"); IPAddress i_IpAddress = i_IpHost.AddressList[1]; IPEndPoint i_IpEndPoint = new IPEndPoint(i_IpAddress, 1111); // Сокет Tcp/Ip s_Listener = new Socket(i_IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Назначение сокета локальной конечной точке и прослушивание входящих сокетов (1 подключение) s_Listener.Bind(i_IpEndPoint); s_Listener.Listen(1); // Прослушивание соединения while (!c_Token.IsCancellationRequested) { try { // Ожидание входящего соединения Socket s_Connection = s_Listener.Accept(); // Считывание данных при подключении (Если есть) byte[] b_Message = new byte[1024]; if (s_Connection.Available > 0) { s_Connection.Receive(b_Message); } // Мы дождались клиента, пытающегося с нами соединиться, получаем данные // Получение имени формулы от клиента string s_FormulaName = GetFormulaName(s_Connection); // Считывание пустой строки (если есть) while (s_Connection.Available > 0) { s_Connection.Receive(b_Message); } // Получение входных параметров от клиента string[] s_InputParameters = GetInputParameters(s_Connection); // Считывание пустой строки (если есть) while (s_Connection.Available > 0) { s_Connection.Receive(b_Message); } // Получение выходного параметра от клиента string s_OutputParameter = GetOutputParameter(s_Connection); // Считывание пустой строки (если есть) while (s_Connection.Available > 0) { s_Connection.Receive(b_Message); } // Получение формулы от клиента string s_Formula = GetFormula(s_Connection, s_InputParameters); // Считывание пустой строки (если есть) while (s_Connection.Available > 0) { s_Connection.Receive(b_Message); } // Сообщение о закрытии string s_Data = "Изменения приняты, для внесения новых изменений выполните повторное подключение."; s_Data += Environment.NewLine; b_Message = Encoding.UTF8.GetBytes(s_Data); s_Connection.Send(b_Message); Thread.Sleep(1000); s_Connection.Shutdown(SocketShutdown.Both); s_Connection.Close(); // Остановка мониторинга bool b_RunMonitoring = m_Monitoring.GetRun; m_Monitoring.StopMonitoring(); // Изменение базы знаний k_Base.EditKnowledgeBase(s_Formula, s_InputParameters, s_OutputParameter, s_FormulaName); // Вывод в таблицу int i_Count = 0; for (int i = 0; i < k_Base.DataAboutFormulas.Length; i++) { i_Count += k_Base.DataAboutFormulas[i].GetInputParameters.Length; } string[,] s_Input = new string[i_Count, 2]; string[,] s_Output = new string[k_Base.DataAboutFormulas.Length, 2]; i_Count = 0; for (int i = 0; i < k_Base.DataAboutFormulas.Length; i++) { for (int j = 0; j < k_Base.DataAboutFormulas[i].GetInputParameters.Length; j++) { s_Input[i_Count, 0] = k_Base.DataAboutFormulas[i].GetInputParameters[j]; s_Input[i_Count, 1] = ""; i_Count++; } s_Output[i, 0] = k_Base.DataAboutFormulas[i].GetOutputParameter; s_Output[i, 1] = ""; } Table.MainOutputInfoInTables(d_InputTable, d_OutputTable, s_Input, s_Output); // Запуск мониторинга if (b_RunMonitoring) { m_Monitoring.RunMonitoring(); } } catch (Exception) { } } } catch (Exception e_Ex) { MessageBox.Show("Код ошибки: " + Math.Abs(e_Ex.GetHashCode()) + ", обратитесь в техподдержку."); } }