Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2019-11-19 | 169 |
5.00
из
|
Заказать работу |
|
|
Данный открытый метод отвечает за пересылку сообщений:
public void Send(string sendMessage)
{
dataWrite = Encoding.UTF8.GetBytes(sendMessage);
stream.BeginWrite(dataWrite, 0, dataWrite.Length, new AsyncCallback(SendCallback), null);
}
Строка sendMessage преобразуется в байтовый массив dataWrite с помощью метода Encoding.UTF8.GetBytes() и отправляется асинхронным методом BeginWrite() по адресу, указанному в конструкторе класса TcpClient в методе Join(), причем количество передаваемых байтов указывается как длина массива dataWrite.Length.
В результате это приведет к срабатыванию закрытого закрытого метода:
private void SendCallback(IAsyncResult ar)
{
stream.EndWrite(ar);
}
Это позволит завершить передачу данных асинхронным способом.
Метод Stop()
Работа приложения может быть завершена следующим открытым методом:
public void Stop()
{
stream.Close();
client.Close();
}
При остановке приложения должен быть закрыт поток stream и разорвано TCP-соединение объекта client.
Таким образом, описанные методы класса ChatClient позволяют инкапсулировать работу с объектом client.
Реализация TCP-клиента
Создание GUI клиента
Перетащите один элемент типа Button, два элемента типа TextBox на форму Form1 и расположите их, как показано на рис. 4.1.
Рисунок 3.4 GUI клиента
Надписи в элементах типа TextBox вводить необязательно.
Создание экземпляра класса ChatClient
Укажите в области видимости класса Form1 в файле Form1.cs следующую строку кода:
private ChatClient cClient = new ChatClient();
Переменная cClient объявлена как закрытое поле данных класса Form1.
Событие Click
Используем кнопку button1 для вызова методов Join(). В окне «Обозреватель решений» двойным щелчком по пункту откроем окно «Конструктор». Двойным щелчком по кнопке button1 автоматически создадим метод, вызываемый в программе при нажатии пользователем этой кнопки. Добавим в тело метода вызов Join():
|
private void button1_Click(object sender, EventArgs e)
{
cClient.Join();
}
Событие FormClosed
В окне «Конструктор» сделайте активной форму. Нажмите значок в окне «Свойства» и задайте событие закрытия формы Form1_FormClosed двойным щелчком мыши по пустому полю справа от FormClosed. В открывшемся окне пропишите вызов метода закрытия сокета cClient.Stop() для данного события, если сокет ещё не закрыт:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
cClient.Stop();
}
Событие KeyDown
В окне «Конструктор» сделайте активным элемент textBox2. Нажмите значок в окне «Свойства» и задайте событие нажатия кнопки textBox2_KeyDown двойным щелчком мыши по пустому полю справа от KeyDown. В открывшемся окне пропишите вызов метода отправки сообщения cClient.Send() для данного события:
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
cClient.Send(textBox2.Text);
textBox2.Clear();
}
}
Сообщение, напечатанное пользователем в поле Text элемента textBox2, будет отправляться только при нажатии клавиши “Enter” в активном элементе textBox2. Оператор ветвления сравнит if код клавиши, нажатой пользователем, с кодом клавиши “Enter”.
Событие MessageExchange
Для того, чтобы GUI программы мог отобразить принятые классом ChatClient сообщения, введем новое событие MessageExchange в данный класс. Для этого создадим открытый делегат в области видимости класса ChatClient в файле ChatClient.cs:
public event EventHandler MessageExchange;
Это событие происходит при приеме или отправке нового сообщения клиентом. В методе BeginReadCallback() после строки recvMessage = Encoding.UTF8.GetString(dataRead, 0, bytesRead); укажите:
MessageExchange(this, EventArgs.Empty);
В методе Send() допишите две строки:
recvMessage = string.Concat("Я> ",sendMessage);
MessageExchange(this, EventArgs.Empty);
Событие произойдет тогда, когда присвоено новое значение строковой переменной recvMessage. Если сообщение написано самим пользователем, то перед ним будет добавлена строка "Я> " с помощью метода string.Concat.
В файле Form1.cs создайте обработчик события cClient_MessageExchange(). Для этого добавьте в области видимости класса новый метод:
private void cClient_MessageExchange(object s, EventArgs e)
|
{
string newMessage = string.Concat(cClient.recvMessage, "\r\n");
if (!textBox1.InvokeRequired)
textBox1.AppendText(newMessage);
else
textBox1.Invoke(new Action<string>((newMsg) => textBox1.AppendText(newMsg)), newMessage);
}
К сообщению cClient.recvMessage добавляются символы возврата каретки \r и перевода строки \n. Новое сообщение newMessage может быть добавлено к тексту в элементе textBox1. Асинхронная природа требует особого внимания к работе с потоками. Использование оператора ветвления if необходимо, так как метод AppendText() может быть вызван в том же потоке только для сообщений, отправляемых самим клиентом. Для сообщений, принятых от других пользователей, необходимо использовать специальный метод Invoke(), который позволяет обратиться к элементам GUI из другого потока.
Добавьте в конструктор Form1() после InitializeComponent(); строку:
cClient.MessageExchange += cClient_MessageExchange;
Оператор += используется для указания метода, который вызывается в ответ на событие. Такие методы называются обработчиками событий. Использование оператора += в этом контексте называется подпиской на событие.
Проверка работы программы
Запустите клиентское приложение с помощью кнопки . Ошибки, возникшие при выполнении кода, будут показаны в окне «Список ошибок». Если клиентское приложение успешно выполнилось, попробуйте отправить любое сообщение на сервер в локальной сети (IP-адрес и порт узнать у преподавателя). Для этого в качестве IP-адреса клиента используйте его адрес в локальной сети. Сделайте скриншот окна клиентской программы для отчета.
При работе клиентского приложения будет возникать большое количество ошибок. Отметьте в отчете возникшие ошибки выполнения программы. Для того, чтобы эти ошибки не выводились на экран в файле ChatClient.cs необходимо поместить методы BeginRead(), BeginWrite(), EndRead(), EndWrite(), Close() и конструктор TcpClient () в блоки try, например:
try
{
client = new TcpClient("127.0.0.1", 5555);
}
catch (Exception)
{
return;
}
Добавьте в этот код оператор ветвления if:
if (client == null)
client = new TcpClient("127.0.0.1", 5555);
Как измениться поведение программы?
Опишите в отчете принцип работы TCP-клиента.
Класс ChatServer
|
|
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!