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

Удалённый объект – форма

КомпонентcsComp (SqwComp),удал.объект csServer (Server),сервер(SqwServer),клиент(SqwMain)

Компонент

// C# File csSqw_Dll_Comp_7

using System;

using System.ComponentModel;

using System.Drawing;

 

namespace csComp

{

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

public class SqwComp: Component

{

private int numComp; // Номер компонента

private Point point; // Координаты шара

 

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

public SqwComp (int NumComp, Point Pnt)

{

numComp= NumComp;

point= Pnt;

}

// Свойство Number

public int Number

{

get

{

return numComp;//nt;

}

}

// Свойство Point

public Point Point

{

get

{

return point;

}

}

}

}

 

Удалённый объект- форма

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

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

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

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

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

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Collections;

using System.ComponentModel;

using System.Runtime.Remoting;

using csComp;

using System.Threading;

 

namespace csServer

{

// Класс формы - удалённого объекта, содержащей контейнер компонентов.

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

public class Server: Form

{

private static int numCompnts= 0;

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

private Random rand; // Случайное число

public Container components = null;

 

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

public Server( )

{

components= new Container ( );

Text= "Контейнер и компоненты";

rand= new Random ( );

}

 

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

public virtual void CreateAdd ( )

{

numCompnts++;

Point point= new Point ( );

point.X= rand.Next (ClientSize.Width);

point.Y= rand.Next (ClientSize.Height);

SqwComp cmpnt= new SqwComp (numCompnts, point);

components.Add (cmpnt);

Invalidate ( );

}

 

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

public virtual void Remove (int Num)

{

IEnumerator inum= components.Components.GetEnumerator ( );

while (inum.MoveNext( )) // Перебрать коллекцию

{

SqwComp cm= (SqwComp) inum.Current;

if (cm.Number == Num)

{

components.Remove (cm); // Удалить из контейнера

Invalidate ( );

break;

}

}

}

 

// Получить массив номеров компонентов

public virtual void GetRefList (ref ArrayList AL)

{

ArrayList aL= new ArrayList ( );

IEnumerator inum= components.Components.GetEnumerator ( );

while (inum.MoveNext( )) // Перебрать коллекцию

{

SqwComp cm= (SqwComp) inum.Current;

aL.Add (cm.Number);

}

AL=aL;

}

 

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

protected override void OnPaint (PaintEventArgs e)

{

base.OnPaint (e);

IEnumerator inum=components.Components.GetEnumerator( );

while (inum.MoveNext( )) // Перебрать коллекцию

{

SqwComp cm= (SqwComp) inum.Current;

e.Graphics.DrawRectangle(new Pen(Color.Blue, 5),

cm.Point.X-20, cm.Point.Y-20, 40, 40);

e.Graphics.DrawString (cm.Number.ToString ( ),

new Font("Arial", 9),

new SolidBrush (Color.Red), cm.Point.X, cm.Point.Y);

}

}

}

}

Сервер

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

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

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

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

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Collections;

using System.ComponentModel;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Http;

using csServer;

using System.Threading;

 

public class SqwServer

{

static void Main ( )

{

Server serv= new Server();

HttpChannel httpChannel;

try

{

httpChannel= new HttpChannel (8080);

ChannelServices.RegisterChannel (httpChannel);

}

catch(Exception e)

{

Console.WriteLine(e.Message);

return;

}

RemotingServices.Marshal (serv, "RemoteServer");

Application.Run(serv);

}

}

 

Клиент

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

// C# File csSqw_Client_7 Клиент

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

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

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

using System;

using System.Collections;

using System.Drawing;

using System.Windows.Forms;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Http;

using csComp;

using csServer;

 

namespace csSqw_Client_7

{

public class SqwMain : System.Windows.Forms.Form

{

private csServer.Server serv;

private Button butAdd;

private Button butDel;

private ListBox listBox;

int numComp= 0;

 

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

public SqwMain ( )

{

Text= "Управление контейнером";

butAdd= new Button ( );

butAdd.Text="Добавить компонент";

butAdd.Location= new Point (10,10);

butAdd.Size= new System.Drawing.Size( 130,20);

butAdd.Click+= new EventHandler (ClickButAdd);

this.Controls.Add (butAdd);

//-----

butDel=new Button ( );

butDel.Text="Удалить компонент с номером :";

butDel.Location= new Point (10,30);

butDel.Size= new System.Drawing.Size (180, 20);

butDel.Click += new EventHandler (ClickButDel);

this.Controls.Add (butDel);

listBox= new ListBox ( );

listBox.Location= new Point (200, 30);

listBox.Size= new System.Drawing.Size (60, 20);

this.Controls.Add (listBox);

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

HttpChannel httpChannel= new HttpChannel (0);

ChannelServices.RegisterChannel (httpChannel);

serv= (csServer.Server) Activator.GetObject(

typeof (csServer.Server),

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

}

 

// Обработчик кнопки

void ClickButAdd (object o, EventArgs e)

{

numComp++;

serv.CreateAdd ( );

ArrayList aL=null;

listBox.Items.Clear ( );

serv.GetRefList (ref aL);

IEnumerator inum=aL.GetEnumerator();

while(inum.MoveNext())

{

int num= (int) inum.Current;

listBox.Items.Add (num);

}

}

 

// Обработчик кнопки

void ClickButDel (object o, EventArgs e)

{

if (listBox.SelectedIndex==-1)

{

MessageBox.Show ("Выберете номер удаляемого

компонента");

}

else

{

int numSel= (int) listBox.SelectedItem;

listBox.Items.Remove (numSel);

serv.Remove(numSel);

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

ArrayList aL=null;

listBox.Items.Clear ( );

serv.GetRefList(ref aL );

 

for(int i= 0; i < aL.Count; i++)

{

int num= (int) aL[i];

listBox.Items.Add (num);

}

}

}

 

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

static void Main ( )

{

SqwMain sqwMain= new SqwMain ( );

Application.Run(sqwMain);

}

}

}