Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

4. Создание приложения Windows Forms: сервер чата на wcf

Чат. Наиболее простое и часто встречающее приложение на WCF для демонстрации возможности технологии удалённого «общения». Так как WCF требует нечто что должно выполнять функции «хоста», то самым простым решением станет создание приложение-сервера, которое будет запускать и останавливать сервис для работы множества (2 и более) приложений-клиентов. Каждое приложение-клиент будет реализовывать удалённый клиент чата — попросту одного пользователя в чате. Средой для связи (сервер-клиент) выступит localhost (локальная машина), но можно использовать и адрес удалённого сервера, например в локальной сети. Ключевым адресом является адрес сервера.

Теперь о нашем приложении:

Приложение будет простой формой с двумя кнопками, одним GroupBox и одним статическим текстовым полем. Одна кнопка будет запускать сервер, вторая останавливать. В Label будет заноситься результат выполнения запуска или остановки.

Открываем снова Visual Studio и создаём пустое решение (Файл -> Создать -> Новый проект). Выбираем Другие типы проектов -> Решение Visual Studio -> Новое решение. Имя выбираем как LWP16:

Рис. 4. 1. Вводим данные нового пустого решения

Жмём ОК. Было добавлено решение, но пока без проектов. Создаём новый проект в текущем решении. Для этого выполним следующие действия: Файл -> Создать -> Проект. В окне открывшемся окне «Создать проект», в поле Решение, выберем: Добавить в решение. В качестве проекта выберем Приложение Windows Forms. Имя будет: LWP16-ChatServer. Жмём ОК. Получим следующее:

Рис. 4. 2. Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки

Сразу же добавим необходимую библиотеку. Должен быть выбрать текущий проект в обозревателе решений (LWP16-ChatServer). Выполним Проект -> Добавить ссылку... -> в окне Добавить ссылку переходим на вкладку .NET и ищем System.ServiceModel:

Рис. 4. 3. Добавить ссылку: добавляем новую ссылку на библиотеку System.ServiceModel

Переименуем форму в обозревателе решений (ПКМ на иконке формы -> Переименовать). Новое имя формы будет LWP16MainServer. После переименования, автоматически изменится свойство (Name) формы.

Теперь изменим свойства формы LWP16MainServer:

Text

изменим с Form1 на Чат на WCF (C#) :: Сервер

^ Поменяем заголовок формы (то, что отображается в шапке приложения слева).

MaximizeBox

изменим с True на False

^ Уберём кнопку Развернуть.

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

FormBorderStyle

> изменим с Sizable на FixedDialog

^ Сделаем окно «неизменяем» по размерам.

Size

изменим со значений 290; 290 на 300; 125

^ Поменяем размер формы.

Расставим элементы с панели инструментов как показано на рисунке ниже:

Рис. 4. 3. Расстановка элементов на форме приложения-сервера

Свойства элементов следующие:

Button:

(Name):

B_Start

Text:

Запуск

Button:

(Name):

B_Stop

Text:

Остановка

GroupBox:

(Name):

GB_1

Text:

Серверные операции

Label:

(Name):

StatusLabel

Text:

Состояние сервера

Событие Click кнопки Запуск:

private void B_Start_Click(object sender, EventArgs e)

{

try

{

cprs = new CustomPeerResolverService(); // Инициалазируем службу узлов

cprs.RefreshInterval = TimeSpan.FromSeconds(5); // Время в секундах обновления таблицы записей распознователя одноранговых узлов

host = new ServiceHost(cprs); // Передаём серверу службу узлов

cprs.ControlShape = true; // Инициализируем совместное использование ссылок

cprs.Open(); // Открываем службу

host.Open(TimeSpan.FromDays(1)); // Запускаем сервер на период одного дня

StatusLabel.Text = "Сервер WCF успешно запущен!";

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

finally

{

B_Start.Enabled = false;

B_Stop.Enabled = true;

}

}

Событие Click кнопки Остановка:

private void B_Stop_Click(object sender, EventArgs e)

{

try

{

cprs.Close();

host.Close();

StatusLabel.Text = "Сервер WCF успешно остановлен!";

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

finally

{

B_Start.Enabled = true;

B_Stop.Enabled = false;

}

}

Отредактируем код файла формы LWP16MainServer.cs. Подключим библиотеки в начале файла:

using System.ServiceModel;

using System.ServiceModel.Channels;

using System.ServiceModel.PeerResolvers;

Найдём:

public partial class LWP16MainServer : Form

{

Добавим после:

private CustomPeerResolverService cprs; // Объекта базовой реализации настраиваемой службы распознователя одноранговых узлов

private ServiceHost host; // Объект сервера для службы

Метод LWP16MainServer():

public LWP16MainServer()

{

InitializeComponent();

B_Stop.Enabled = false;

}

Теперь нужно сконфигурировать сервер, для этого воспользуемся стандартный App.Config. Так как при создании приложения Winfows Forms файл конфигурации не создаётся, то нужно создать его самостоятельно. Должен быть выбрать текущий проект в обозревателе решений (LWP16-ChatServer). Выполним Проект -> Добавить новый элемент... (Ctrl+Shift+A). В открывшемся окне выберем Файл конфигурации приложения. Имя оставим неизменным.

Откроем новый добавленный файл App.config и вставим в файл следующий XML-код:

<?xml version="1.0"?>

<configuration>

<system.serviceModel>

<services>

<service name="System.ServiceModel.PeerResolvers.CustomPeerResolverService">

<host>

<baseAddresses>

<add baseAddress="net.tcp://localhost:5433/LWP16_ChatServer"/>

</baseAddresses>

</host>

<endpoint address="net.tcp://localhost:5433/LWP16_ChatServer" binding="netTcpBinding" bindingConfiguration="TcpConfig" contract="System.ServiceModel.PeerResolvers.IPeerResolverContract">

</endpoint>

</service>

</services>

<bindings>

<netTcpBinding>

<binding name="TcpConfig">

<security mode="None"></security>

</binding>

</netTcpBinding>

</bindings>

</system.serviceModel>

</configuration>

Здесь основные значения содержатся в поле:

<add baseAddress="net.tcp://localhost:5433/LWP16-ChatServer"/>

Строчкой выше указывается локальный адрес и порт. Вместо localhost можно использовать реальный IP-адрес. Следующая строка:

<endpoint address="net.tcp://localhost:5433/LWP16-ChatServer" binding="netTcpBinding" bindingConfiguration="TcpConfig" contract="System.ServiceModel.PeerResolvers.IPeerResolverContract">

</endpoint>

Обратим внимание на привязку netTcpBinding.

Эта привязка создаёт стек связи времени выполнения по умолчанию, использующий режим безопасности транспорта, протокол TCP для доставки сообщений, а также кодирование двоичных сообщений. Эта привязка является должным предоставляемым системой выбором Windows Communication Foundation для взаимодействия через интрасеть.

Конфигурация по умолчанию для привязки netTcpBinding быстрее, чем конфигурация, предоставляемая привязкой wsHttpBinding, но она предназначена только для взаимодействия WCF с WCF. Режим безопасности настраивается с помощью дополнительного атрибута securityMode. Использование WS-ReliableMessaging настраивается с использованием дополнительного атрибута reliableSessionEnabled. Но по умолчанию надежный обмен сообщениями отключен. В общем случае системные привязки по протоколу HTTP, такие как wsHttpBinding и basicHttpBinding, настроены на включение основных возможностей по умолчанию, в то время как привязка netTcpBinding по умолчанию отключает возможности, так что для получения поддержки, например для спецификаций WS-*, необходимо специально их включить. Это означает, что используемая по умолчанию конфигурация для TCP быстрее при обмене сообщениями между конечными точками, чем конфигурация по умолчанию для привязок HTTP.

Привязка задается в файлах конфигурации клиента и службы (App.config). Тип привязки указывается в атрибуте binding элемента <endpoint>. Если необходимо настроить привязку netTcpBinding и изменить некоторые из ее параметров, необходимо определить конфигурацию привязки. Конечная точка должна ссылаться на конфигурацию привязки с атрибутом bindingConfiguration. Для нашего случая атрибут имеет привязку к имени TcpConfig:

<binding name="TcpConfig">

<security mode="None"></security>

</binding>

Компилируем приложение (Release) и запускаем. Запускаем и останавливаем сервер. Не должно быть никаких ошибок при нажатии кнопок:

Рис. 4. 4. Модифицированное приложение Windows Forms: работа сервера чата после запуска