Методы Send() и SendCallback() — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Методы Send() и SendCallback()

2019-11-19 169
Методы Send() и SendCallback() 0.00 из 5.00 0 оценок
Заказать работу

Данный открытый метод отвечает за пересылку сообщений:

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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.