Пример создания распределенного приложения, демонстрирующего удаленное взаимодействие между компьютерами в сети. Пространство имен System.Runtime.Remoting

Пример создания распределенного приложения, демонстрирующего удаленное взаимодействие между компьютерами в сети. Пространство имен System.Runtime.Remoting. Протокол Http

В данной теме описывается один из способов разработки простейшего распределенного приложения, которое использует удаленное взаимодействие между компьютерами в сети. По данному примеру можно научиться разрабатывать приложения, которые взаимодействуют между собой в локальной сети. Тема предусматривает наличие базовых навыков работы в Microsoft Visual Studio 2010.


Содержание



Условие задачи

1. Разработать распределенное приложение, которое содержит следующие части:

  • серверная часть. Сервер должен содержать функции решения математических задач. В данном случае, в качестве примера сервер содержит метод, который решает квадратное уравнение. Серверная часть должна быть разработана как консольное приложение;
  • клиентская часть. Клиент содержит программный код, который получает результат из серверной части. Клиент вызывает функцию решения квадратного уравнения, которая реализована и выполняется на сервере. Клиентская часть должна быть разработана как приложение типа Windows Forms.

2. Взаимодействие между клиентом и сервером организовать на основе протокола Http.

3. Приложение реализовать в системе Microsoft Visual Studio 2010 с использованием языка программирования C# .NET.

4. Для организации взаимодействия между компьютерами использовать средства из пространства имен System.Runtime.Remoting.

 

Соображения

Для проверки правильности выполнения задачи, нужно наличие как минимум двух компьютеров, которые объединенные между собой в локальную сеть.
Разработка распределенного приложения осуществляется на одном компьютере в MS Visual Studio 2010. Тестирование взаимодействия клиентской и серверной частей осуществляются также на одном компьютере.
После завершения тестирования, серверный код размещается на компьютере-сервере. Клиентский код из компьютера-клиента делает запрос на компьютер-сервер, получает ответ и выводит этот ответ на экран. В нашем случае клиентский код вызывает серверную функцию решения квадратного уравнения.

 

Выполнение

1. Запустить Microsoft Visual Studio 2010

 

2. Разработка общей сборки с метаданными

2.1. Что такое общая сборка?

Для того, чтобы клиент и сервер взаимодействовали между собой, нужно наличие еще одной части программного кода – общей сборки. Общая сборка содержит метаданные типов, которые являются допустимыми для удаленного вызова. Метаданные типов – это информация о типах данных, которые используются при удаленном вызове. Эта информация нужна как клиенту, так и серверу.
В конечном счете, после создания, программный код общей сборки должен размещаться как на компьютере клиента, так и на компьютере сервера. В противном случае, связь между клиентом и сервером невозможно будет установить.

 

2.2. Создание модуля общей сборки

В нашем случае общая сборка не является исполняемым файлом. Это есть библиотека, которая сохраняется в формате *.dll.
В Microsoft Visual Studio 2010 для создания библиотеки используется шаблон Class Library. В данном примере, чтобы создать модуль общей сборки нужно выполнить команду

File -> New -> Project...

Откроется окно «New Project», в котором нужно выбрать Visual C# -> Class Library. В нашем случае папка для размещения библиотеки: «D:\Programs». Имя библиотеки ClassLibrary1 (по умолчанию). По желанию, можно изменить папку и имя библиотеки.

Visual Studio C# Создание библиотеки шаблон Class Library

Рис. 1. Создание библиотеки по шаблону Class Library

После выбора OK, создается проект, который содержит один файл Class1.cs. Листинг файла следующий:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
    }
}

По умолчанию создается класс с именем Class1 в пространстве имен ClassLibrary1. В нашем случае оставляем все как есть. По желанию можно изменить название класса и пространства имен.

 

2.3. Текст модуля общей сборки

В модуль Class1.cs нужно ввести необходимый программный код. Этот код будет выполняться на стороне сервера. А вызов этого кода будет осуществлять клиент.
В соответствии с условием задачи, сервер может решать математические задачи. Поэтому, в класс Class1 нужно вписать функцию решения квадратного уравнения. В нашем случае функция называется CalcEquation(). По желанию, сюда можно вписать другие функции, которые решают разные задачи.
Также класс Class1 наследует данные и методы класса MarshalByRefObject. Класс MarshalByRefObject обеспечивает доступ к объектам в пределах домена приложения в приложениях, которые поддерживают удаленный доступ. Это специально разработанный класс для поддержки распределенного доступа к приложениям.

В классе MarshalRefObject есть метод CreateObjRef(), который будет использован в нашем проекте. Метод CreateObjRef() содержит всю необходимую информацию для генерирования прокси. Прокси применяется чтобы соединиться с удаленным объектом.

Листинг модуля общей сборки следующий (файл Class1.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    // класс Class1 наследует класс MarshalByRefObject
    public class Class1 : MarshalByRefObject
    {
        // функция вычисления квадратного уравнения
        public bool CalcEquation(double a, double b, double c, out double x1, out double x2)
        {
            double d; // дискриминант

            // Решение квадратного уравнения
            // вычисление дискриминанта
            d = b * b - 4 * a * c;

            if (d > 0)
            {
                x1 = (-b - Math.Sqrt(d)) / (2 * a);
                x2 = (-b + Math.Sqrt(d)) / (2 * a);
                return true;
            }
            else
            if (d == 0)
            {
                x1 = x2 = (-b) / (2 * a);
                return true;
            }
            else
            {
                x1 = x2 = 0;
                return false;
            }
        }
    }
}

 

2.4. Объяснение к методу решения квадратного уравнения

Метод решения квадратного уравнения CalcEquation() получает входными параметрами значения коэффициентов a, b, c. Если уравнение имеет решение, то метод возвращает true и значение корней уравнения в параметрах-переменных x1, x2. Если уравнение не имеет решения, то метод возвращает false и нулевые значения параметров-переменных x1, x2.

 

2.5. Компиляция. Создание .dll — файла общей сборки

На этом шаге нужно откомпилировать проект командой

Build -> Build Solution

В результате будет создан *.dll-файл общей сборки с именем ClassLibrary1.dll, которая размещается в папке

D:\Programs\ClassLibrary1\ClassLibrary1\bin\Debug\

Этот файл нужно будет разместить в папках с исполняемыми модулями на компьютере-клиенте и на на компьютере-сервере. Файл общей сборки готов.

MS Visual Studio Файл ClassLibrary1.dll

Рис. 2. Файл ClassLibrary1.dll

 

2.6. Закрыть решение (проект)

Общая сборка разработана. Чтобы закрыть решение (Solution) нужно выполнить команду

File->Close Solution

На следующем этапе будет разрабатываться программный код серверной части распределенного приложения.

 

3. Создание программного кода, который будет размещаться на компьютере-сервере

После создания файла (модуля) общей сборки на одном и том же компьютере нужно разработать программный код, который будет размещаться на компьютере-сервере.
Чтобы сервер отвечал на запросы клиента, программный код серверной части должен быть запущен на выполнение в момент запроса.

3.1. Создание приложения типа Console Application

В соответствии с условием задачи, на серверной части нужно создать приложение типа Console Application. Это осуществляется стандартным способом с помощью команды

File -> New -> Project...

В результате откроется окно New Project (рисунок 3), в котором нужно:

  • выбрать шаблон Visual C# -> Console Application;
  • оставить имя проекта по умолчанию ConsoleApplication1. По желанию можно изменить это имя;
  • выбрать папку для проекта D:\Programs (или другую папку);
  • установить опцию «Create directory for solution».

Visual Studio C# Окно создание консольное приложение

Рис. 3. Окно создания консольного приложения

В результате будет создано обычное консольное приложение, которое содержит файл Program.cs. В этом файле объявляется пространство имен ConsoleApplication1, в котором реализован класс Program.

Листинг файла следующий

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

 

3.2. Добавление ссылок на сборки

Чтобы использовать программный код общей сборки нужно подключить:

  • сборку System.Runtime.Remoting. Эта сборка содержит все необходимые средства для удаленного доступа;
  • общую сборку ClassLibrary1, которая была разработана в п.2. В этой сборке размещается метод решения квадратного уравнения.

 

3.2.1. Добавление ссылки на сборку System.Runtime.Remoting

Чтобы добавить ссылку на сборку System.Runtime.Remoting нужно выполнить следующую последовательность команд.

В окне Solution Explorer вызвать команду Add Reference… как показано на рисунке 4. Для этого нужно сделать клик правой кнопкой мыши на элементе References.

Microsoft Visual Studio C# Команда "Add Reference..."

Рис. 4. Команда Add Reference…

В результате откроется диалоговое окно Add Reference (рисунок 5), в котором нужно:

  • активировать вкладку .NET;
  • в перечне сборок выбрать сборку System.Runtime.Remoting;
  • подтвердить выбор кнопкой OK.

MS Visual Studio C# Подключение сборки System.Runtime.Remoting.dll

Рис. 5. Подключение сборки System.Runtime.Remoting.dll

После этого в Solution Explorer в проекте ConsoleApplication1 будет отображена сборка System.Runtime.Remoting (рисунок 6).

MS Visual Studio сборка System.Runtime.Remoting

Рис. 6. Подключенная к проекту сборка System.Runtime.Remoting

 

3.2.2. Добавление ссылки на сборку ClassLibrary1

Добавление ссылки на сборку ClassLibrary1 осуществляется такой же командой «Add Reference…», как подключение сборки System.Runtime.Remoting (рисунок 4).
В результате откроется окно Add Reference, в котором нужно активировать вкладку Browse как показано на рисунке 7.
В окне, с помощью нисходящего меню «Папка» нужно выбрать папку, в которой размещается ранее разработанная общая сборка (см. п. 2) с именем ClassLibrary1.

В нашем случае выбирается папка (см. п. 2.4):

D:\Programs\ClassLibrary1\ClassLibrary1\bin\Debug\

MS Visual Studio C# файл общей сборки ClassLibrary1.dll

Рис. 7. Выбор папки и файла общей сборки

После выбора OK, в окне Solution Explorer в перечне References ссылок на использованные сборки появится сборка ClassLibrary1.

Visual Studio C# Сборка ClassLibrary1 серверное приложение

Рис. 8. Сборка ClassLibrary1 в перечне сборок серверного приложения

 

3.2.3. Подключение пространств имен сборок ClassLibrary1 и System.Runtime.Remoting в программный код файла Program.cs

После подключения сборок к проекту, нужно подключить необходимые пространства имен в файле Program.cs. Добавляются 4 пространства имен:

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using ClassLibrary1;

На данный момент текст файла Program.cs следующий

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// добавление пространств имен
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

using ClassLibrary1; // библиотека общей сборки

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

 

3.3. Написание кода серверной части
3.3.1. Действия, которые нужно выполнить на сервере

На компьютере-сервере нужно выполнить три основных действия:

  1. Создать канал связи. Для этого хорошо подходит класс HttpChannel. Есть и другие классы. Создается объект канала типа HttpChannel;
  2. Зарегистрировать канал с помощью статического класса ChannelServices. В этом классе есть метод RegisterChannel(). Этот метод получает параметром канал (тип HttpChannel в нашем случае) и опцию задействования службы безопасности (bool);
  3. Зарегистрировать сервис как WKO-тип (Well Known Object, хорошо известный объект). Это осуществляется с помощью класса RemotingConfiguration. В этом классе есть статический метод RegisterWellKnownServiceType(), который осуществляет регистрацию сервиса.

 

3.3.2. Текст кода серверной части

Ниже приведен текст программного кода серверной части

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// добавление пространств имен
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

using ClassLibrary1; // библиотека общей сборки

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. Создать канал между клиентом и сервером, создать объект типа HttpChannel
            HttpChannel ch = new HttpChannel(5000); // номер порта = 5000 - выбран наугад

            // 2. Зарегистрировать канал ch, в методе RegisterChannel() указывается уровень безопасности false
            ChannelServices.RegisterChannel(ch, false);

            // 3. Зарегистрировать сервис как WKO
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(ClassLibrary1.Class1),
                "MathFunctions.soap",
                WellKnownObjectMode.Singleton);

            // 4. Вывести сообщения, что сервис в состоянии выполнения
            Console.WriteLine("MathFunctions service is ready...");

            // 5. Остановить, оставить сервис в состоянии выполнения, пока не будет нажата клавиша Enter
            Console.ReadLine();
        }
    }
}

Объясним некоторые фрагменты кода серверной части.

Сначала создается канал связи, который представлен объектом ch типа HttpChannel. Конструктор класса HttpChannel() получает параметром номер порта, через который происходит связь между компьютерами. Номер порта может быть числом от 0 до 65535. Рекомендуется задавать номер порта выше значения 1024.
На втором этапе происходит регистрация канала ch с помощью класса ChannelServices. Это осуществляет метод класса RegisterChannel(). Первый параметр метода – это канал ch, который нужно зарегистрировать. Второй параметр – флажок типа bool. Значение флажка true требует запуск канала в пределах IIS (Internet Information Server) с целью обеспечения безопасности. Поскольку, наше приложение запускается за пределами IIS, то значение флажка нужно установить в false.

На третьем этапе нужно зарегистрировать сервис как WKO-тип (Well Known Object). Это реализуется с помощью класса RemotingConfiguration. В этом классе есть метод RegisterWellKnownServiceType(). Этот метод получает три параметра:

  • тип данных, который есть типом нашего созданного класса Class1 в общей сборке ClassLibrary1. В нашем случае здесь нужно передать typeof(ClassLibrary1.Class1);
  • строка, которая идентифицирует наш сервис на компьютере-сервере. В нашем случае выбрано «MathFunctions.soap». По желанию можно выбрать другое название;
  • значением из перечисления WellKnownObjectMode.Singleton. Это значит, что серверный объект разделяется всеми клиентами сервера.

В конце вызывается метод Console.Readline(). Этот метод необходим, чтобы зафиксировать выполнение консольного приложения, поскольку серверная часть должна быть все время запущена. В это время клиенты смогут к ней обращаться. Завершение работы сервера – клавиша Enter.

 

3.4. Компиляция. Файлы серверной части

На этом шаге нужно откомпилировать текст командой

Build -> Build Solution

для получения исполняемого (*.exe) файла. В результате будет создан исполняемый файл с именем

D:\Programs\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe

На рисунке 9 отображено содержимое папки Debug с файлами проекта серверной части. Как видно из рисунка 9, автоматически подгружается файл общей сборки ClassLibrary1.dll.

папка Debug файл ConsoleApplication1.exe ClassLibrary1.dll

Рис. 9. Содержимое папки Debug с исполняемым файлом ConsoleApplication1.exe серверной части и файлом сборки ClassLibrary1.dll

Оба файла ConsoleApplication1.exe и ClassLibrary1.dll нужно будет разместить (скопировать) на компьютере-сервере.

После этого проект, который соответствует серверной части, завершен.

 

4. Разработка приложения клиентской части

В сети с несколькими компьютерами, клиентов может быть сколько угодно, а сервер один. Сервер должен отвечать на запросы клиентов. В нашем случае достаточно разработать одно приложение, которое делает запросы к серверу. Затем исполняемый .exe файл (модуль) этого приложения и .dll файл общей сборки нужно скопировать (распространить) по всей сети на клиентские компьютеры.

4.1. Создание приложения клиентской части по шаблону Windows Forms

Проект по шаблону Windows Forms создается стандартным способом:

File->New Project...

В результате откроется окно New Project. В окне New Project нужно выбрать вкладку

Visual C# -> Windows Forms Application

как показано на рисунке 10.

Проект Windows Forms Application

Рис. 10. Проект типа Windows Forms Application, который будет размещаться на компьютере клиента

В проекте задаются:

  • имя проекта WindowsFormsApplication1;
  • папка проекта D:\Programs.

После выбора OK будет создана новая форма проекта как показано на рисунке 11.

Visual Studio C# форма проект

Рис. 11. Новая форма проекта

 

4.2. Проектирование формы
4.2.1. Размещение элементов управления Label, Button, TextBox на форме

Нужно разместить на форме следующие элементы управления (рисунок 12):

  • четыре элемента управления типа Label. По умолчанию создаются объекты с именами label1, label2, label3, label4;
  • один элемент управления типа Button. По умолчанию создается объект с именем button1.

MS Visual Studio C# элемент управления форма

Рис. 12. Размещение элементов управления на форме

 

4.2.2. Настройка свойств фомы и элементов управления

Подробное описание того, как осуществляется настройка элементов управления на форме можно найти в теме:

На этом шаге, с помощью окна Properties, нужно настроить следующие свойства формы и элементов управления:

  • в форме Form1, свойство Text = «Решение квадратного уравнения»;
  • в форме Form1, свойство StartPosition = CenterScreen;
  • в Label1, свойство Text = «a = «;
  • в Label2, свойство Text = «b = «;
  • в Label3, свойство Text = «c = «;
  • в Label4, свойство Text = «Результат: «.

После настройки элементов управления, окно формы будет иметь вид как показано на рисунке 13.

MS Visual Studio C# Окно программа-клиент

Рис. 13. Окно программы-клиента после настройки

После этого можно разрабатывать программный код клиента.

 

4.3. Текст модуля формы Form1.cs

Главной форме программы-клиента соответствует модуль (файл) с именем Form1.cs.
На данный момент листинг файла Form1.cs имеет следующий вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

 

4.4. Алгоритм работы программы-клиента

На компьютере клиенте нужно выполнить следующие действия:

  • создать канал соединения с сервером. В нашем случае используется класс HttpChannel. В отличие от сервера, клиенту номер порта не нужен. Поэтому, при создании класса будет вызываться конструктор HttpChannel() без номера порта. Для сервера номер порта обязательно нужно задавать, чтобы клиент знал где его найти. А клиенту номер порта не нужен, так как для создания канала система сама выберет первый подходящий порт;
  • зарегистрировать канал в системе с помощью класса ChannelServices, в котором есть соответствующий метод RegisterChannel();
  • создать экземпляр (объект) типа Class1. Этот класс есть реализованный в общей сборке (см. п.2). В этом классе есть метод вычисления квадратного уравнения CalcEquation(). Для создания экземпляра используется класс Activator. В классе Activator есть статический метод GetObject(), который создает прокси между клиентом и сервером для загруженного объекта WKO. Метод GetObject() возвращает объект типа Object, через который можно будет вызвать его отдаленные методы (в нашем случае, метод CalcEquation());
  • вызвать метод CalcEquation() из созданного экземпляра. Получить результат решения квадратного уравнения и вывести его на форму. Это все будет осуществляться в обработчике события клика на кнопке «Вычислить».

 

4.5. Написание программного кода клиентской части
4.5.1. Добавление ссылок на сборки

Для того, чтобы использовать код общей сборки, на компьютере-клиенте нужно подключить:

  • программный код общей сборки ClassLibrary1.dll;
  • программный код сборки System.Runtime.Remoting.dll.

Это осуществляется командой «Add Reference…» так же, как было сделано для серверной части (см. п.п. 3.2.1, 3.2.2).
После подключения, вкладка References в окне Solution Explorer будет иметь вид, как показано на рисунке 14.

Visual Studio C# Вкладка References окно Solution Explorer сборка

Рис. 14. Вкладка References в окне Solution Explorer. Подключенные сборки ClassLibrary1 и System.Runtime.Remoting

 

4.5.2. Подключение пространств имен

Как и в случае с серверной частью, в файле Form1.cs нужно подключить пространства имен общей сборки и System.Runtime.Remoting с помощью директивы using.

...

// подключение пространств имен
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using ClassLibrary1; // общая сборка

...

 

4.5.3. Написание кода метода Form1_Load()

Создание канала между сервером и клиентом в клиентской части будет выполняться только один раз. После того, как канал создан, многократно может вызываться метод CalcEquation() из серверной части.
Учитывая вышесказанное, целесообразно запрограммировать событие Load формы Form1. Это событие вызывается в начале создания формы. В нашей программе этому событию соответствует обработчик Form1_Load(). В обработчике нужно разместить программный код создания канала, регистрации канала и создания отдаленного объекта.

Ниже приведен текст обработчика события Form1_Load():

private void Form1_Load(object sender, EventArgs e)
{
    // Выполнение действий на стороне клиента
    // 1. Создать канал между клиентом и сервером
    HttpChannel ch = new HttpChannel(); // номер порта не нужен

    // 2. Зарегистрировать канал
    ChannelServices.RegisterChannel(ch, false);

    // 3. Создать объект удаленного доступа к серверу
    remote = (Class1)Activator.GetObject(
                 typeof(Class1),
                  "http://localhost:5000/MathFunctions.soap"); // localhost - временное имя нашего компьютера
}

 

4.5.4. Программирование события клика на кнопке «Вычислить». Текст клиентской части

На этом шаге нужно запрограммировать обработку события клика на кнопке «Вычислить» (button1). Подробное описание того как программируется событие описывается в теме:

Текст программы-клиента с реализованным обработчиком события клика на кнопке «Вычислить» приведен ниже

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// подключение пространств имен
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using ClassLibrary1; // общая сборка

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Class1 remote; // переменная, которая представляет удаленный доступ

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 4. Вызвать метод CalcEquation() из серверной части для вычисления квадратного уравнения
            double a, b, c;
            double x1, x2;
            bool f;
            a = Double.Parse(textBox1.Text);
            b = Double.Parse(textBox2.Text);
            c = Double.Parse(textBox3.Text);

            // вызов удаленного метода
            f = remote.CalcEquation(a, b, c, out x1, out x2);

             // вывод результата
             if (f)
                 label4.Text = "Результат: x1 = " + x1.ToString() + "; x2 = " + x2.ToString();
             else
                 label4.Text = "Уравнение не имеет корней.";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Выполнение действий на стороне клиента
            // 1. Создать канал между клиентом и сервером
            HttpChannel ch = new HttpChannel(); // номер порта не нужен

             // 2. Зарегистрировать канал
             ChannelServices.RegisterChannel(ch, false);

             // 3. Создать объект удаленного доступа к серверу
             remote =  (Class1)Activator.GetObject(
              typeof(Class1),
               "http://localhost:5000/MathFunctions.soap"); // localhost - временное имя нашего компьютера
        }
    }
}

В вышеприведенном коде пока что задается общее имя нашего компьютера localhost. Если будет сеть, то это имя нужно будет заменить на компьютере-клиенте на сетевое имя компьютера сервера. Клиентский проект нужно будет снова перекомпилировать.

 

5. Тестирование взаимодействия между клиентом и сервером на одном компьютере без использования локальной сети

Тестирование взаимодействия между клиентом и сервером проводится на одном компьютере, который в системе носит имя localhost. После проведения тестирования это имя будет изменено на имя компьютера-сервера в сети.

Для проведения тестирования нужно:

  • запустить серверное приложение (рисунок 15) из папки сервера (см. п. 3);
  • запустить на выполнение клиентское приложение (рисунок 16) из папки клиента (см. п. 4);
  • ввести в клиентское приложение данные и провести вычисления.

Visual Studio C# серверная часть выполнение

Рис. 15. Выполнение серверной части

Приблизительный результат выполнения клиентского приложения приведен на рисунке 16.

MS Visual Studio C# Клиентская программа

Рис. 16. Клиентская программа

Важно: если закрыть программу-сервер и попробовать провести вычисления на клиенте, то возникнет исключительная ситуация. Система не сможет найти приложение-сервер. Значит, для проведения тестирования, сервер должен все время выполняться.
Клиентов можно запускать сколько угодно и производить запросы к серверу.

 

6. Копирование серверной части на другой компьютер

На этом шаге нужно скопировать файлы ConsoleApplication1.exe и ClassLibrary1.dll на компьютер-сервер. Это осуществляется с помощью, например, обычного файлового менеджера. Файлы копируются в заведомо подготовленную папку.

 

7. Определение имени сервера в сети из компьютера-клиента

Если компьютеры объединены в локальную сеть, то каждый из них имеет свое уникальное имя. Способ определения имени компьютера в сети зависит от конкретной реализации операционной системы. В общем случае, чтобы определить это имя, нужно вызвать утилиту Control Panel (Панель управления). В этой утилите можно выбрать элемент System (Система). Откроется окно, в котором можно прочитать имя компьютера.

 

8. Корректирование клиентского программного кода. Замена имени localhost

Если известно имя компьютера-сервера в локальной сети, тогда нужно в клиентской части сделать изменения. В исходном коде файла Form1.cs в методе Form_Load() вместо строки

"http://localhost:5000/MathFunctions.soap"

нужно ввести

"http://MyComp:5000/MathFunctions.soap"

где MyComp – имя компьютера-сервера в локальной сети. Скорей всего у вас будет другое имя.

Итак, текст обработчика события загрузки формы в нашем случае следующий:

...
private void Form1_Load(object sender, EventArgs e)
{
    // Выполнение действий на стороне клиента
    // 1. Создать канал между клиентом и сервером
    HttpChannel ch = new HttpChannel(); // номер порта не нужен

    // 2. Зарегистрировать канал
    ChannelServices.RegisterChannel(ch, false);

    // 3. Создать объект удаленного доступа к серверу
    remote = (Class1)Activator.GetObject(
               typeof(Class1),
                "http://MyComp:5000/MathFunctions.soap"); // MyComp - имя сервера в сети
}

...

После этого нужно перекомпилировать клиентский проект, чтобы сформировать новый исполняемый модуль. На рисунке 17 изображен файл WindowsFormsApplication1.exe клиентского модуля. В этой папке также есть общая сборка ClassLibrary1.dll.

Папка клиентский модуль WindowsFormsApplication1

Рис. 17. Папка с клиентским исполняемым модулем WindowsFormsApplication1

 

9. Тестирование взаимодействия между клиентом и сервером на разных компьютерах, объединенных между собой в локальную сеть

На этом этапе нужно протестовать работу между клиентом и сервером на разных компьютерах, которые объединенные между собой в локальную сеть.

Для этого, нужно:

  • с помощью файлового менеджера скопировать в некоторую папку на компьютер-сервер файлы ConsoleApplication1.exe и ClassLibrary1.dll;
  • запустить на сервере файл ConsoleApplication1.exe. Предварительно на сервере должна быть установлена библиотека .NET Framework 4.0;
  • скопировать в нужную папку файлы WindowsFormsApplication1.exe (клиентское приложение) и ClassLibrary1.dll;
  • запустить на клиентской части файл WindowsFormsApplication1.exe, ввести данные, проверить результат выполнения функции из сервера.

Важно: чтобы между клиентом и сервером было взаимодействие, компьютер-клиент должен иметь соответствующие права доступа к компьютеру-серверу. Например, на сервере может быть включен общий доступ к его ресурсам. Это все осуществляется соответствующими настройками на компьютере-сервере. В данной теме это не рассматривается.

 


Связанные темы