Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Топ:
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2019-11-19 | 182 |
5.00
из
|
Заказать работу |
|
|
Создадим проект для клиента. Для этого зайдем в меню «Файл» и выберем пункт «Создать проект…». Выберем проект приложения «Приложение Windows Forms» на языке C#. Рекомендуется назвать проект client, а в качестве имени решения использовать lab2 (рис. 3.1).
Рисунок 3.1 Интерфейс окна создания проекта «Приложение Windows Forms»
Создание класса ChatClient
Создадим класс, который бы инкапсулировал работу с экземпляром класса TcpClient.
Рисунок 3.2 Добавление нового класса в проект клиентского приложения
Для создания класса необходимо вызвать контекстное меню нажатием правой кнопки мыши на имени проекта client в окне «Окно классов» или «Обозреватель решений», выбрать пункт меню «Добавить» и подпункт «Класс…» (рис. 3.3).
В открывшемся диалоговом окне задайте имя файла, которое соответствует имени нового класса (рис. 3.4). Рекомендуется назвать класс ChatClient. После нажатия кнопки «Добавить» новый класс должен появиться в «Окне классов». Для дальнейшей работы необходимо открыть файл ChatClient.cs двойным щелчком по названию класса в «Обозревателе решений» или «Окне классов». В рабочей области VS возникнет автоматически сгенерированный код для класса ChatClient.
Рисунок 3.3 Диалоговое окно создания класса ChatClient
Цель создания данного класса — инкапсуляция работы с объектом client. Для достижения цели нам потребуется решить три задачи: создать метод для подключения клиента к серверу, метод для передачи и приема сообщений по TCP-протоколу и метод для прекращения работы сервера.
Создание объекта client
Для создания объекта класса TcpClient можно использовать строку кода:
System.Net.Sockets.TcpClient client;
Запись упрощается, если применить директиву using к пространству имен System.Net.Sockets:
|
TcpClient client;
Поэтому сразу после директивы using System.Threading.Tasks; в блок директив необходимо дописать:
using System.Net.Sockets;
Это позволит вызывать методы для работы с TcpClient в более короткой форме.
Закрытое поле данных client объявляется в файле ChatClient.cs в области видимости ChatClient:
private TcpClient client;
Далее, как закрытые поля данных следует объявить следующие переменные:
private NetworkStream stream;
private byte[] dataWrite;
private byte[] dataRead;
Класс NetworkStream позволяет производить одновременно и передачу, и прием данных. Байтовые массивы dataWrite и dataRead соответственно используются при передаче и приеме данных с помощью асинхронных методов.
VS автоматически проверяет корректность вашего кода. Для получения подробной информации об ошибках наведите курсор на подчёркнутый текст.
Метод Join()
Для подключения к серверу может быть использован следующий открытый метод:
public void Join()
{
client = new TcpClient("127.0.0.1", 48654);
stream = client.GetStream();
dataWrite = new byte[client.SendBufferSize];
dataRead = new byte[client.ReceiveBufferSize];
stream.BeginRead(dataRead, 0, client.ReceiveBufferSize, new AsyncCallback(BeginReadCallback), null);
}
С помощью конструктора класса TcpClient создается объект client. Сразу же после создания объект client пытается установить соединение по указанному IP-адресу, например, "127.0.0.1", и порту, например, 48654. Для установления соединения необходимо знать IP-адрес и порт сервера. В случае неудачи приложение завершит работу с ошибкой. Метод GetStream() класса TcpClient позволяет получить доступ к объекту класса NetworkStream через переменную stream. На основании открытых полей данных SendBufferSize и ReceiveBufferSize класса TcpClient создаются байтовые массивы dataRead и dataWrite для приема и передачи информации. Асинхронный метод чтения данных BeginRead() позволяет записать данные в байтовый массив dataRead в отдельном потоке выполнения с помощью метода BeginReadCallback().
Метод BeginReadCallback()
Для обработки полученных сообщений заведем открытое поле данных в классе ChatClient. Для этого запишем области видимости этого класса:
public string recvMessage;
Строковая переменная recvMessage — это последнее принятое сообщение.
|
Закрытый метод BeginReadCallback() отвечает за обработку принятого сообщения:
private void BeginReadCallback(IAsyncResult ar)
{
int bytesRead = stream.EndRead(ar);
recvMessage = Encoding.UTF8.GetString(dataRead, 0, bytesRead);
stream.BeginRead(dataRead, 0, client.ReceiveBufferSize, new AsyncCallback(BeginReadCallback), null);
}
С помощью метода EndRead() класса NetworkStream в байтовый массив dataRead записывается принятое сообщение. Оно преобразуется в строку lastMessage с помощью метода Encoding.UTF8.GetString(). После обработки сообщения клиент снова запускает метод асинхронного приема данных BeginReadCallback().
|
|
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!