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



 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

Text изменим с Form 1 на Чат на 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 файл конфигурации не создаётся, то нужно создать его самостоятельно. Должен быть выбрать текущий проект в обозревателе решений (LWP 16- 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: работа сервера чата после запуска

 


Дата добавления: 2019-09-13; просмотров: 310; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!