Esempio n. 1
0
        // метод обработки сообщений
        public static void handleResults(byte[] data, IPEndPoint remoteIp)
        {
            // если мы не закончили работу
            if (!done)
            {
                // отправитель
                string sender = remoteIp.Address.ToString();
                // полученное сообщение
                string   message = Encoding.Unicode.GetString(data);
                string[] msgArr  = message.Split('~');
                // тип сообщения
                messageType type = AdditionalComponents.stringToMessageType(msgArr[1]);
                // текст сообщения
                message = msgArr[0];
                // получатель сообщения
                string _receiver = msgArr[2];
                // если тип сообщения - Join (клиент подключился)
                if (type == messageType.Join)
                {
                    // добавляем адрес клиента в список
                    clientAddresses.Add(sender);
                    // увеличиваем счетчик количества подключившихся клиентов
                    clientCount++;
                    // сообщаем о подключении
                    Console.WriteLine("UDP >> Клиент " + sender + " успешно подключен!");
                    // если все клиенты подключились
                    if (clientCount == clientCountMax)
                    {
                        // ввод с клавиатуры количества массивов для генерации
                        Console.Write(">> Введите количество массивов, которые нужно сгенерировать: ");
                        count = int.Parse(Console.ReadLine());
                        // отправляем клиентам сообщение о необходимости начала генерации (количество массивов делим на количество клиентов)
                        if (clientAddresses.Count > 0)
                        {
                            //Console.WriteLine(">> Отправка запросов генерации " + (1.1 * count / clientCountMax) + " (+10%) массивов...");
                            Console.WriteLine(">> Отправка запросов генерации " + (count / clientCountMax) + " массивов...");

                            for (int i = 0; i < clientAddresses.Count; i++)
                            {
                                //SendMessage((1.1 * count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]);
                                SendMessage((count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]);
                            }
                        }
                    }
                }
                // если мы - получатели
                if (_receiver == AdditionalComponents.LocalIPAddress())
                {
                    // если тип сообщения - Data (получили сгенерированные массивы)
                    if (type == messageType.Data)
                    {
                        // разбиение полученного пакета на отдельные (каждый кусок соответствует одному сгенерированному массиву)
                        string[] energyDataStr = message.Split('/');
                        for (int i = 0; i < energyDataStr.Length - 1; i++)
                        {
                            // содержимое каждого сгенерированного массива
                            List <double> energyData = new List <double>();
                            // извлечение данных из сообщения
                            string[] energyValues = energyDataStr[i].Split('|');
                            // конвертация
                            for (int j = 0; j < energyValues.Length - j; j++)
                            {
                                energyData.Add(Convert.ToDouble(energyValues[j]));
                            }
                            // добавление сгенерированного массива в список
                            generatedData.Add(new EnergyInput(energyData));
                            // сохранение в файл
                            StreamWriter sw = new StreamWriter("generatedData.txt", true);
                            sw.WriteLine(energyDataStr[i].Replace('|', ';'));
                            sw.Close();
                        }
                        Console.WriteLine("UDP >> Получен пакет данных от " + sender + " длиной " + data.Length + " байт; массивов в пакете: " + (energyDataStr.Length - 1));
                    }
                    // если тип сообщения - TransmissionEnd (сообщение об окончании передачи)
                    else if (type == messageType.TransmissionEnd)
                    {
                        // извлекаем из сообщения время генерации
                        double time = Math.Round(Convert.ToDouble(message), 2);
                        // если этот клиент потратил на генерацию больше времени, чем какой-либо другой, то записываем это время как новое
                        if (time > totalClientTime)
                        {
                            totalClientTime = time;
                        }
                        // отмечаем в массиве флагов, что клиент закончил генерацию
                        doneByClients[clientAddresses.IndexOf(sender)] = true;

                        Console.WriteLine("UDP >> Клиент " + sender + " завершил передачу данных, сгенерированных за " + time + " секунд!");

                        // проверяем, все ли клиенты закончили генерацию
                        int c = 0;
                        foreach (bool client in doneByClients)
                        {
                            if (client)
                            {
                                c++;
                            }
                        }

                        // если все клиенты закончили
                        if (c == clientAddresses.Count)
                        {
                            // отмечаем флаг завершения работы
                            done = true;

                            /*double lost = 1.1 * count - generatedData.Count();
                            *  double lostp = 110 * lost / generatedData.Count();*/
                            // выводим информационные сообщения
                            Console.WriteLine(">> Все клиенты завершили передачу данных!");
                            Console.WriteLine(">> Сгенерировано массивов: " + count);
                            //Console.WriteLine(">> Сгенерировано массивов: " + generatedData.Count() + " / " + count);
                            //Console.WriteLine(">> Потеряно при передаче: " + Math.Round(lost, 0) + " (" + Math.Round(lostp, 2) + "%)");

                            /*if (generatedData.Count > count)
                             * {
                             *  Console.WriteLine(">> Компенсационные излишки: " + (generatedData.Count() - count));
                             *  generatedData.RemoveRange(count, generatedData.Count - count);
                             *  Console.WriteLine(">> Итого массивов: " + generatedData.Count());
                             * }*/
                            Console.WriteLine(">> Потрачено времени на выполнение: " + Math.Round(totalClientTime, 2) + " секунд");
                            Console.WriteLine(">> Нажмите любую клавишу для выхода...");
                            // выход из программы
                            Console.ReadKey();
                            Environment.Exit(0);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        // метод обработки сообщений
        private static void ReceiveMessage()
        {
            // UdpClient для получения данных
            UdpClient receiver = new UdpClient(localPort);

            // подключаемся к широковещательной рассылке
            receiver.JoinMulticastGroup(serverAddress, 20);
            // адрес отправителя
            IPEndPoint remoteIp = null;

            try
            {
                // бесконечный цикл
                while (true)
                {
                    // получение сообщения в виде массива байтов
                    byte[] data = receiver.Receive(ref remoteIp);
                    // отправитель
                    string sender = remoteIp.Address.ToString();
                    // полученное сообщение
                    string   message = Encoding.Unicode.GetString(data);
                    string[] msgArr  = message.Split('~');
                    // тип сообщения
                    messageType type = AdditionalComponents.stringToMessageType(msgArr[1]);
                    // текст сообщения
                    message = msgArr[0];
                    // получатель сообщения
                    string _receiver = msgArr[2];
                    // мы - получатели
                    if (_receiver == AdditionalComponents.LocalIPAddress())
                    {
                        // если тип сообщения - TransmissionBegin (начало передачи)
                        if (type == messageType.TransmissionBegin)
                        {
                            // сохраняем IP-адрес сервера
                            serverIP = sender;
                            // извлекаем из сообщения количество массивов для генерации и порядковый номер клиента
                            string[] msg = message.Split('|');
                            count     = Convert.ToInt32(msg[0]);
                            clientNum = Convert.ToInt32(msg[1]);
                            // выводим информационное сообщение
                            Console.WriteLine("UDP >> Получен запрос генерации " + count + " массивов данных от " + sender + ", запуск");
                            // начинаем генерацию
                            beginGeneration();
                        }
                    }

                    // если все потоки завершили работу
                    if (abortFlag)
                    {
                        Console.WriteLine(">> Нажмите любую клавишу для выхода...");
                        Console.ReadKey();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("UDP >> " + ex.Message);
            }
            finally
            {
                receiver.Close();
            }
        }