public Drawing_Paint_CLient() { InitializeComponent(); label2.BackColor = Color.Black; //По умолчанию для пера задан черный цвет, поэтому мы зададим такой же фон для label2 g = panel1.CreateGraphics(); //Создаем область для работы с графикой на элементе panel pic = new Bitmap(panel1.Width, panel1.Height); // картинка listener = new UdpMessageListener <Lines>(Ports.LineServerPort); listener.IncomingMessage += OnLinesMessage; listener.Start(); SMlistener = new UdpMessageListener <ServiceMessage>(Ports.SMServerPort); SMlistener.IncomingMessage += OnServiceMessage; SMlistener.Start(); Pictlistener = new UdpMessageListener <Pictures>(Ports.PictPort); Pictlistener.IncomingMessage += OnPicturesMessage; Pictlistener.Start(); using (var writer = NetworkingFactory.UdpWriter <ServiceMessage>(IPAddress.Parse(serverIP), Ports.SMPort)) { var info = new ServiceMessage(Command.GetPic); writer.Write(info); } }
// функция передаёт на сервер информацию о том, что экран был очищен private void my_clear() { using (var writer = NetworkingFactory.UdpWriter <ServiceMessage>(IPAddress.Parse(serverIP), Ports.SMPort)) { var info = new ServiceMessage(Command.CleanScreen); writer.Write(info); } }
/// <summary> /// Конструктор формы для отправки нового вопроса в базу данных /// </summary> /// <param name="ipAddressString"> ip-адрес сервера </param> public AddQuestionForm(string ipAddressString) { _server = NetworkingFactory.UdpWriter <ServiceMessage>(IPAddress.Parse(ipAddressString), 8080); InitializeComponent(); VarComboBox.Items.AddRange(new string[] { "1", "2" }); }
private void my_Pen() { Pen pen = new Pen(color, (float)numericUpDown1.Value); //Создаем перо, задаем ему цвет и толщину. // если закомментирована строчка ниже, то клиент не рисует на своей доске сам, // а передаёт линию серверу, который рисует на клиентах // g.DrawLine(pen, CurrentPoint, PrevPoint); //Соединияем точки линиями using (var writer = NetworkingFactory.UdpWriter <Lines>(IPAddress.Parse(serverIP), 8080)) { var info = new Lines(CurrentPoint, PrevPoint, pen); writer.Write(info); } }
// функция пересылает картинку с сервера всем клиентам 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 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); }
//Обработка сообщения пришедшего на сервер private static void OnServiceMessage(object sender, IncommingMessageEventArgs <ServiceMessage> e) { if (e != null && e.Message.Command == Command.CountQuestions) { //Обработка запроса об общем количестве вопросов, хранящихся в базе string connectionString = GetConnectionString(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); int maxQuestionNumber; string query = @"SELECT COUNT(*) cnt FROM [QUESTIONS]"; using (SqlCommand command = new SqlCommand(query, connection)) { maxQuestionNumber = Convert.ToInt32(command.ExecuteScalar()); using (var writer = NetworkingFactory.UdpWriter <Question>(e.Sender.Address, 9091)) { var info = new Question(Convert.ToString(maxQuestionNumber), null, null, null, null, null); writer.Write(info); } } } } else if (e != null && e.Message.Command == Command.NextQuestion) { //обработка запроса следующего вопроса string connectionString = GetConnectionString(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string query = @"SELECT text, answer, var1, var2, var3, var4 FROM [QUESTIONS] WHERE id = @Id";//+ e.Message.Num; using (SqlCommand command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@Id", SqlDbType.Int); command.Parameters["@Id"].Value = e.Message.Num; using (SqlDataReader reader = command.ExecuteReader()) { reader.Read(); int columnId = reader.GetOrdinal("text"); string text = reader.GetString(columnId); columnId = reader.GetOrdinal("answer"); string answer = reader.GetString(columnId); // columnId = reader.GetOrdinal("var1"); string var1 = reader.GetString(columnId); columnId = reader.GetOrdinal("var2"); string var2 = reader.GetString(columnId); columnId = reader.GetOrdinal("var3"); string var3 = reader.GetString(columnId); columnId = reader.GetOrdinal("var4"); string var4 = reader.GetString(columnId); // using (var writer = NetworkingFactory.UdpWriter <Question>(e.Sender.Address, 9090)) { var info = new Question(text, answer, var1, var2, var3, var4); writer.Write(info); } } } } } else if (e != null && e.Message.Command == Command.AddQuestion) { //обработка запроса добавления нового вопроса в базу string connectionString = GetConnectionString(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandText = @"INSERT INTO Questions VALUES (@Id, @Text, @Answer, @Var1, @Var2, @Var3, @Var4)"; command.Parameters.AddWithValue("@Id", SqlDbType.Int); command.Parameters.AddWithValue("@Text", SqlDbType.NVarChar); command.Parameters.AddWithValue("@Answer", SqlDbType.NVarChar); command.Parameters.AddWithValue("@Var1", SqlDbType.NVarChar); command.Parameters.AddWithValue("@Var2", SqlDbType.NVarChar); command.Parameters.AddWithValue("@Var3", SqlDbType.NVarChar); command.Parameters.AddWithValue("@Var4", SqlDbType.NVarChar); string query = @"SELECT COUNT(*) cnt FROM [QUESTIONS]"; using (SqlCommand commandS = new SqlCommand(query, connection)) { command.Parameters["@Id"].Value = Convert.ToInt32(commandS.ExecuteScalar()) + 1; } command.Parameters["@Text"].Value = e.Message.Question.Text; command.Parameters["@Answer"].Value = e.Message.Question.Answer; command.Parameters["@Var1"].Value = e.Message.Question.Var1; command.Parameters["@Var2"].Value = e.Message.Question.Var2; if (e.Message.Question.Var3 != "") { command.Parameters["@Var3"].Value = e.Message.Question.Var3; } else { command.Parameters["@Var3"].Value = ""; } if (e.Message.Question.Var4 != "") { command.Parameters["@Var4"].Value = e.Message.Question.Var4;; } else { command.Parameters["@Var4"].Value = ""; } command.ExecuteNonQuery(); } } }