//Обработка события нажатия на кнопку "Проверить"
        private void CheckQuestionButton_Click(object sender, EventArgs e)
        {
            string caption = "Info";
            bool   right   = false;

            //Проверяем соответствует ли выбранный ответ правильному
            switch (_answer)
            {
            case "1":
            {
                right = radioButton1.Checked;
                break;
            }

            case "2":
            {
                right = radioButton2.Checked;
                break;
            }

            case "3":
            {
                right = radioButton3.Checked;
                break;
            }

            case "4":
            {
                right = radioButton4.Checked;
                break;
            }
            }

            var message = right? "Ответ правильный" : "Ответ неверен";

            if (right)
            {
                rightAnswer++;
            }

            MessageBoxButtons buttons = MessageBoxButtons.OK;

            MessageBox.Show(message, caption, buttons);

            //Если текущий вопрос не последний, то отправляем на сервер запрос следующего вопроса
            if (NumQuestion != maxQuestionNumber)
            {
                ServiceMessage msg = new ServiceMessage(Command.NextQuestion, perm[NumQuestion]);
                _server.Write(msg);
            }
            //Иначе завершаем тестирование и выводим результат для пользователя
            else
            {
                message  = "Тест завершен. Правильных ответов " + rightAnswer;
                message += " из " + maxQuestionNumber + ".";
                MessageBox.Show(message, caption, buttons);
                _listener.Dispose();
                Close();
            }
        }
 // функция пересылает картинку с сервера всем клиентам
 private void Send_picture()
 {
     foreach (var client in _clientList)
     {
         try
         {
             Monitor.Enter(panel1);
             Monitor.Enter(pic);
             _client_pictures = NetworkingFactory.UdpWriter <Pictures>(client, Ports.PictPort);
             var msg = new Pictures(pic);
             _client_pictures.Write(msg);
         }
         finally
         {
             Monitor.Exit(panel1);
             Monitor.Exit(pic);
         }
     }
 }
        //Обработка нажатия на кнопку "Добавить вопрос в базу"
        private void OnAddButton(object sender, EventArgs e)
        {
            string            caption = "Info";
            var               message = "";
            MessageBoxButtons buttons = MessageBoxButtons.OK;

            //Проверяем, что введенных данных достаточно для добавления вопроса в базу
            if (QTextBox.Text == null ||
                TextVar1.Text == null ||
                TextVar2.Text == null ||
                VarComboBox.SelectedItem == null ||
                (TextVar3.Text == null && TextVar4.Text != null))
            {
                message = "Вопрос не может быть добавлен. Недостаточно данных.";
            }
            else if ((VarComboBox.SelectedItem.ToString() == "3" && TextVar3.Text == null) ||
                     (VarComboBox.SelectedItem.ToString() == "4" && TextVar4.Text == null))
            {
                message = "Вопрос не может быть добавлен. Вариант, выбранный в качестве правильного, пуст.";
            }

            if (message != "")
            {
                MessageBox.Show(message, caption, buttons);
            }
            else
            {
                //Создаем объет "Вопрос" и инициализируем его введенными в поля формы данными
                var question = new Question(QTextBox.Text,
                                            Convert.ToString(VarComboBox.SelectedItem),
                                            TextVar1.Text, TextVar2.Text, TextVar3.Text, TextVar4.Text);
                //Отправляем сообщение на сервер
                ServiceMessage msg = new ServiceMessage(question, Command.AddQuestion);
                _server.Write(msg);

                message = "Вопрос успешно добавлен в базу.";
                MessageBox.Show(message, caption, buttons);

                //Закрываем форму
                this.Close();
            }
        }
        private static void OnServiceMessage(object sender, IncommingMessageEventArgs <Lines> e)
        {
            // если такого клиента, который прислал линию, ещё нет в списке, добавить его в список
            if (!_clientList.Contains(e.Sender.Address))
            {
                _clientList.Add(e.Sender.Address);
            }
            // для каждого клиента в списке подключенных (потом вместо списка можно использовать БД)
            foreach (var client in _clientList)
            {
                //_client.Dispose();
                _client = NetworkingFactory.UdpWriter <Lines>(client, 9090);
                var msg = new Lines(e.Message.PrPoint(), e.Message.CurtPoint(), e.Message.pen());
                // для графического объекта вызываем стандартную функцию рисования линии с аргументами, полученными от клиента
                g.DrawLine(e.Message.pen(), e.Message.CurtPoint(), e.Message.PrPoint());

                _client.Write(msg);
                _client.Dispose();
            }
        }
        // обработчик события "появилась линия"
        private void OnLinesMessage(object sender, IncommingMessageEventArgs <Lines> e)
        {
            // если такого клиента, который прислал линию, ещё нет в списке, добавить его в список
            if (!_clientList.Contains(e.Sender.Address))
            {
                _clientList.Add(e.Sender.Address);
            }
            // для каждого клиента в списке подключенных (потом вместо списка можно использовать БД)
            foreach (var client in _clientList)
            {
                _client_line = NetworkingFactory.UdpWriter <Lines>(client, Ports.LineServerPort);
                var msg = new Lines(e.Message.PrPoint(), e.Message.CurtPoint(), e.Message.pen());

                // передать информацию о линии всем клиентам
                _client_line.Write(msg);
                _client_line.Dispose();
            }

            try
            {
                Monitor.Enter(panel1);
                Graphics G = Graphics.FromImage(pic);
                foreach (var line in linesList)
                {
                    G.DrawLine(line.pen(), line.CurtPoint(), line.PrPoint());
                }
                linesList = new List <Lines>();

                G.DrawLine(e.Message.pen(), e.Message.CurtPoint(), e.Message.PrPoint());
                G.Dispose();
            }
            catch
            {
                linesList.Add(e.Message);
            }
            finally
            {
                Monitor.Exit(panel1);
            }
        }
        // обработчик события "очистка экрана"
        private void OnServiceMessage(object sender, IncommingMessageEventArgs <ServiceMessage> e)
        {
            // если такого клиента, который прислал линию, ещё нет в списке, добавить его в список
            if (!_clientList.Contains(e.Sender.Address))
            {
                _clientList.Add(e.Sender.Address);
            }

            if (e.Message.Command == Command.CleanScreen)
            {
                //для каждого клиента в списке подключенных
                foreach (var client in _clientList)
                {
                    _client = NetworkingFactory.UdpWriter <ServiceMessage>(client, Ports.SMServerPort);
                    var msg = new ServiceMessage(Command.CleanScreen);
                    linesList = new List <Lines>();
                    clear();

                    _client.Write(msg);
                    _client.Dispose();
                }
            }
            else if (e.Message.Command == Command.GetPic)
            {
                try
                {
                    Monitor.Enter(panel1);
                    Monitor.Enter(pic);
                    _client_pictures = NetworkingFactory.UdpWriter <Pictures>(e.Sender.Address, Ports.PictPort);
                    var msg = new Pictures(pic);
                    _client_pictures.Write(msg);
                }
                finally
                {
                    Monitor.Exit(panel1);
                    Monitor.Exit(pic);
                }
            }
        }
        /// <summary>
        /// Конструктор формы для прождения теста
        /// </summary>
        /// <param name="ipAddressString"> ip-адрес сервера </param>
        public QuestionForm(string ipAddressString)
        {
            _listener = new UdpMessageListener <Question>(9090);
            _listener.IncomingMessage += OnIncomingQuestion;
            _listener.Start();
            _server = NetworkingFactory.UdpWriter <ServiceMessage>(IPAddress.Parse(ipAddressString), 8080);

            InitializeComponent();

            //Отправляем на сервер запрос о количестве вопросов в базе данных
            ServiceMessage msg = new ServiceMessage(Command.CountQuestions);

            _server.Write(msg);

            bool flag = false;

            //Пытаемся получить ответ на запрос от сервера
            try
            {
                var reader  = NetworkingFactory.UdpReader <Question>(9091);
                var Message = reader.Read(15000);
                var Sender  = reader.Sender;

                int.TryParse(Message.Text, out maxQuestionNumber);
                flag = true;
                reader.Dispose();
            }
            catch (Exception e)
            {
                //MessageBoxButtons buttons = MessageBoxButtons.OK;
                //MessageBox.Show(e.Message, "Error Detected in Input", buttons);
            }

            //Если ответ от сервера не получен, показываем соответствующее сообщение для пользователя
            string caption = "Info";
            var    message = "";

            if (!flag)
            {
                message = "Сервер не отвечает.";
            }
            else if (maxQuestionNumber == 0)
            {
                message = "В базе нет ни одного вопроса.";
            }

            if (message != "")
            {
                MessageBoxButtons buttons = MessageBoxButtons.OK;
                MessageBox.Show(message, caption, buttons);
            }

            CountLabel.Text = "В базе " + maxQuestionNumber + " вопросов.";

            //Генерируем случайную последовательность вопросов
            perm = Enumerable.Range(1, maxQuestionNumber).ToArray();
            Random r = rnd;

            for (int i = maxQuestionNumber - 1; i >= 1; i--)
            {
                int j = r.Next(i + 1);

                int temp = perm[j];
                perm[j] = perm[i];
                perm[i] = temp;
            }

            //Отправляем на сервер запрос первого вопроса теста
            msg = new ServiceMessage(Command.NextQuestion, perm[NumQuestion]);
            _server.Write(msg);
        }
Exemple #8
0
 public void Write(INetworkWriter networkWriter)
 {
     Write(networkWriter.Write(this));
 }
 public void Write(INetworkWriter networkWriter, NetworkConnection connection)
 {
     Write(networkWriter.Write(this), connection);
 }