Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Проверка работы клиентского приложения



Запустите приложение с помощью кнопки . Ошибки, возникшие при выполнении кода, будут показаны в окне «Список ошибок». Если клиентское приложение успешно выполнилось, попробуйте отправить любое сообщение на сервер времени и даты в локальной сети (IP-адрес и порт узнать у преподавателя). Для этого в качестве IP-адреса клиента используйте его адрес в локальной сети. Зафиксируйте отправленное сообщение и ответ сервера в отчете.

Верните в рабочую область VS окно «Конструктор». Обратите внимание, что в раскрывающемся списке в верхней части вспомогательного окна «Свойства» представлены все элементы, помещенные на форму Form1 (рис. 4.2). Выберите элемент button1. Найдите поле Text и измените его значение с “button1” на «Старт». Аналогичным образом задайте исходные значения поля Text для всех элементов формы.

Нажмите значок  в окне «Свойства» и задайте обработчик события закрытия формы Form1_FormClosed двойным щелчком мыши по пустому полю справа от FormClosed. В открывшемся окне пропишите вызов метода закрытия сокета serverSocket.Close() для данного события, если сокет ещё не закрыт.

Рисунок 4.2 Интерфейс работы со свойствами элементов

Запустите приложение. Сделайте скриншот окна приложения для отчета, используя сочетание клавиш Alt+PrtScr. Опишите в отчете принцип работы с клиентским приложением и его интерфейс.

Создание сервера

Создание проекта сервера в VS

Создайте еще один проект приложения Windows Forms на языке C#. Рекомендуется назвать проект server и добавить его к решению lab1.

Создание GUI сервера

Перетащите один элемент типа Button, два элемента типа Label и три элемента типа TextBox на форму Form1 и расположите их, как показано на рис. 5.1.

Рисунок 5.1 GUI сервера

Зайдите в меню ПРОЕКТ→Назначить запускаемым проектом, чтобы в дальнейшем работать с сервером, а не с клиентом.

Создание сокета и байтовых массивов

Допишите две дополнительные директивы для работы с сокетами в файле Form1.cs.

Для корректной работы сервера необходимо создать один дескриптор сокета, два байтовых массива и одну булеву переменную. Они объявляются в файле Form1.cs в области видимости класса Form1:

private Socket serverSocket;

private bool isServerSocketClosed = true;

private byte[] byteDataRecv = new byte[1024];

private byte[] byteDataSend = new byte[1024];

Уже на этом этапе заметно, что сервер мало отличается от клиента с точки зрения программной реализации.

Метод ServerStart()

Пользователь должен иметь возможность включать и выключать серверное приложение. Для этого необходимо реализовать методы запуска и остановки работы сервера. Для запуска сервера мы будем использовать закрытый метод ServerStart():

private void ServerStart()

{

try

{

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

IPAddress ipAddress;

if (!IPAddress.TryParse(textBox1.Text, out ipAddress))

ipAddress = IPAddress.Any;

Int32 port;

if (!Int32.TryParse(textBox2.Text, out port))

port = 40000;

EndPoint epServer = (EndPoint)new IPEndPoint(ipAddress, port);

serverSocket.Bind(epServer);

EndPoint epSender = (EndPoint)new IPEndPoint(ipAddress, 0);

serverSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), epSender);

textBox3.Text = "Сервер запущен (" + epServer.ToString() + ")";

button1.Text = "Стоп";

isServerSocketClosed = false;

}

catch (Exception ex)

{

textBox3.Text = "При создании сокета возникла ошибка";

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Порт, выбираемый по-умолчанию, отличается от клиентского для удобства запуска клиента и сервера на одном ПК.

Метод ReceiveCallback()

Каждый принятая дейтаграмма будет вызывать срабатывание метода ReceiveCallback():

private void ReceiveCallback(IAsyncResult ar)

{

try

{

EndPoint epSender = (EndPoint)new IPEndPoint(IPAddress.Any, 0);

int bytesRead = serverSocket.EndReceiveFrom(ar, ref epSender);

if (bytesRead > 0)

{

string stringRead = Encoding.UTF8.GetString(byteDataRecv, 0, bytesRead);

DateTime DTNow = System.DateTime.Now;

string DTString = DTNow.ToString("D", System.Globalization.CultureInfo.CreateSpecificCulture("ru-RU"));

byteDataSend = System.Text.Encoding.UTF8.GetBytes(DTString);

Array.Clear(byteDataRecv, 0, bytesRead);

serverSocket.BeginSendTo(byteDataSend, 0, byteDataSend.Length, SocketFlags.None, epSender, new AsyncCallback(SendCallback), null);

serverSocket.BeginReceiveFrom(byteDataRecv, 0, byteDataRecv.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveCallback), epSender);

}

}

catch (ObjectDisposedException)

{

if (isServerSocketClosed)

return;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Сервер времени и даты", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

Особое внимание необходимо уделить работе со временем и датой.


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 216; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.014 с.)
Главная | Случайная страница | Обратная связь