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