Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Удалённый объект – объект с событиями




Разработка многокомпонентной программы с удалённым объектом

Компонент csSqw_Dll (SqwComp), Удап.объект csSqw_RemObject_Dll (RemObj), сервер (SqwModels), клиент (SqwMain)

 

Последовательность разработки сервера и клиента:

 

1) Создать библиотеку csSqw_Dll с компонентом SqwComp. Подсоединить (Project/Add Reference) к ней библиотеку System.Drawing.dll, содержащую используемый класс Point.

Выполнить команду Build/Build Solution.

 

2) Создать библиотеку csSqw_RemObj_Dll с удалённым объектом RemOb j, его интерфейсом IRemObj и классом RemObjEventArgs данных события. Подсоединить (Project/Add Reference) к ней библиотеку System.Runtime.Remoting.dll, содержащую класс MarshalByRefObject

Выполнить команду Build/Build Solution.

 

3) Создать консольное приложение csSqw_Server, подключив к нему библиотеки System.Runtime.Remoting.dll, System.Windows.Forms, System.Drawing, csSqw_Dll.dll, csSqw_RemObject_Dll.dll.

Выполнить команды Build/Build Solution и Debug/ Start Without Debugging.

Появится прикладное и консольное окно сервера. После запуска клиента в этом окне будут отображаться добавляемые в контейнер компоненты (квадраты синего цвета с красными номерами соответствующих компонентов).

 

4) Создать консольное приложение csSqw_Client, подключив к нему библиотеки System.Runtime.Remoting.dll, System.Windows.Forms, System.Drawing, csSqw_RemObject_Dll.dll.

Выполнить команды Build/Build Solution и Debug/ Start Without Debugging.

Появится прикладное и консольное окно клиента с двумя кнопками и элементом списка. Используя кнопки возможно добавление и удаление компонентов в контейнер сервера. Добавленные компоненты будут отображаться в прикладном окне сервера (квадраты синего цвета с красными номерами соответствующих компонентов).

 

5) Можно создать ещё одно приложение-клиент и осуществлять добавление и удаление компонентов на сервере из двух клиентов. Желательно модифицировать эту программу, введя удалённое событие, которое позволило во время модифицировать списки во всех клиентах.

/////////////////////////

// C# File csSqw_Dll Компонент

// Подключить (Project/AddReference) System.Drawing.dll

using...

 

namespace csSqw_Dll

{

// Класс компонента SqwComp

public class SqwComp: Component // Класс компонента

{...

 

// Конструктор

public SqwComp (int NumComp, Point Pnt)

{... }

 

// Свойство Number - номер компонента

public int Number

{.. }

}

}

/////////////////////////

// C# File csSqw_RemObj_Dll Удалённый объект

// Подсоединить (Project/Add Reference) System.Runtime.Remoting.dll

using...

 

namespace csSqw_RemObject_Dll

{

// Класс объекта данных события evToCont из удалённого объекта

public class RemObjEventArgs: EventArgs

{... }

 

// Интерфейс удалённого объекта RemObj

public interface IRemObj

{

void CreateAdd (); // Создать компонент

void Remove (int num); // Удалить компонент с номером num...

}

 

// Тип делегата события evToCont удалённого объекта

public delegate void FromRemObjToCont (RemObjEventArgs args,

ref ArrayList aL);

 

// Тип удалённого объекта

public class RemObj: MarshalByRefObject, IRemObj

{

public event FromRemObjToCont evToCont; // ссылка на событие

 

// Конструктор

public RemObj ()

{

}

 

// Создать объект компонента и добавить в контейнер

public void CreateAdd ()

{

if (evToCont!= null)

{

RemObjEventArgs a= new RemObjEventArgs

("CreateAdd", 0);

ArrayList aL= null;

evToCont (a, ref aL);

}

}

 

// Удалить компонент из контейнера с указанным номером

public void Remove (int num)

{

if (evToCont!= null)

{

RemObjEventArgs a= new RemObjEventArgs

("Remove", num);

ArrayList aL= null;

evToCont (a,ref aL);

}

}

...

}

}

/////////////////////////

// C# File csSqw_Server Сервер

// Подсоединить (Project/AddReference) csSqw_RemObject_Dll.dll

// Подсоединить (Project/AddReference) System.Runtime.Remoting.dll

// Подсоединить (Project/AddReference) csSqw_Dll.dll

using...

 

// Класс формы, содержащей контейнер компонентов.В области клиента

// этой формы отображаются компоненты

public class SqwModels: Form

{

public SqwComp cs; // Ссылка на компонент

public Container components = null;

...

// Конструктор

public SqwModels()

{

components= new Container ();

...

}

 

// Обработать событие от объекта класса RemObj

public void RemObjHandler (RemObjEventArgs args, ref ArrayList aL)

{

switch (args.command)

{

case "CreateAdd": CreateAdd ();

break;

case "Remove": Remove (args.number);

break;

...

}

}

 

// Создать компонент и добавить его в контейнер

public virtual void CreateAdd ()

{

...

SqwComp cmpnt= new SqwComp

(numCompnts, point);

components.Add (cmpnt);

Invalidate ();

}

 

...

 

// Перерисовать область клиента прикладного окна сервера

protected override void OnPaint (PaintEventArgs e)

{

...

}

// Главная функция сервера

static void Main ()

{

SqwModels sqwModels= new SqwModels ();

sqwModels.Show ();

RemObj remObj= new RemObj ();

remObj.evToCont += new

FromRemObjToCont (sqwModels.RemObjHandler);

HttpChannel httpChannel;

try

{

httpChannel= new HttpChannel (8080);

ChannelServices.RegisterChannel (httpChannel);

}

catch(Exception e)

{

Console.WriteLine (e.Message);

return;

}

RemotingServices.Marshal(remObj, "RemoteObject");

Application.Run (sqwModels);

GC.Collect ();

GC.WaitForPendingFinalizers ();

}

}

 

/////////////////////////

// C# File csSqw_Clien t Клиент

// Подсоединить (Project/AddReference) csSqw_RemObj_Dll.dll

// Подсоединить (Project/AddReference) System.Runtime.Remoting.dll

 

using...

using csSqw_RemObject_Dll;

 

// Класс основной формы с управляющими элементами

public class SqwMain: Form

{

private IRemObj iRemObj; // Ссылка на прокси

private Button butAdd; // Ссылка на кнопку добавления

...

 

// Конструктор

public SqwMain ()

{

butAdd= new Button ();

butAdd.Click+= new EventHandler (ClickButAdd);

...

/////////////////////////////////////////////

HttpChannel httpChannel= new HttpChannel (0);

ChannelServices.RegisterChannel (httpChannel);

iRemObj= (IRemObj) Activator.GetObject(

typeof (IRemObj),

"http://localhost:8080/RemoteObject");

}

// Обработчик кнопки "Добавить компонент"

void ClickButAdd (object o, EventArgs e)

{

...

iRemObj.CreateAdd (); // Создать и добавить компонент

// Обновить управляющий элемент списка

...

}

 

...

 

// Главная функция клиента

static void Main ()

{

SqwMain sqwMain= new SqwMain ();

Application.Run(sqwMain);

}

}

}

 





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


Дата добавления: 2017-02-11; Мы поможем в написании ваших работ!; просмотров: 306 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Начинать всегда стоит с того, что сеет сомнения. © Борис Стругацкий
==> читать все изречения...

2349 - | 2104 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.