Приклад розробки розподіленого додатку, що демонструє віддалену взаємодію між комп’ютерами в мережі. Простір імен 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 для створення бібліотеки використовується шаблон 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\

Цей файл потрібно буде розмістити (скопіювати) в папках з виконавчими модулями на комп’ютері-клієнті та на комп’ютері-сервері. Файл спільної збірки готовий.

C# файл 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.

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

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

У результаті відкриється діалогове вікно Add Reference (рисунок 5), в якому потрібно:

  • активувати вкладку .NET;
  • у переліку збірок вибрати збірку System.Runtime.Remoting;
  • підтвердити вибір кнопкою OK.

Visual Studio Вікно "Add Reference" System.Runtime.Remoting.dll

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

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

Visual Studio C# збірка 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\

Visual Studio C# Вибір папка файл спільна збірка

Рис. 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.

Visual Studio C# Проект Windows Forms створення

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

У проекті задається:

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

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

MS Visual Studio форма проект

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

 

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

Потрібно розмістити на формі такі елементи управління (рисунок 12):

  • чотири елементи управління типу Label. За замовчуванням створюються об’єкти з іменами label1, label2, label3, label4;
  • один елемент управління типу Button. За замовчуванням створюється об’єкт з іменем button1.

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.

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.

Вкладка References збірка ClassLibrary1 System.Runtime.Remoting

Рис. 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);
  • ввести в клієнтський додаток дані і провести обчислення.

MS Visual Studio C# Виконання серверної частини

Рис. 15. Виконання серверної частини

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

розподілений додаток клієнтська програма

Рис. 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, ввести дані, перевірити результат виконання функції з сервера.

Щоб між клієнтом та сервером була взаємодія, комп’ютер-клієнт повинен мати відповідні права доступу до комп’ютера-сервера. Наприклад, на сервері може бути включений спільний доступ до його ресурсів. Це все здійснюється відповідними налаштуваннями на комп’ютері-сервері. У даній темі це не розглядається.

 


Зв’язані теми