Разработка многокомпонентной программы с удалённым объектом
Компонент 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);
}
}
}