Автор работы: Пользователь скрыл имя, 18 Февраля 2013 в 21:39, лабораторная работа
Цель:. Обучение работе с объектами NET Remoting ObjectByValue, ObjectByReference (WellKnown ( Singleton, SingleCall), ClientActivated) и несколькими каналами (HTTP, OPC) в приложении.
Навыки:. Создание северного и клиентского приложения с использованием NET Remoting
Задача: Серверная часть: Необходимо создать сервер. NET Remoting обрабатывающий запросы по каналу HTTP (порт 13000), имеющий следующую архитектуру (схематично).
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ
Кафедра ИТ-6 «Управление и моделирование систем»
Специальность 230105
«Программное обеспечение вычислительной техники и автоматизированных систем»
Отчёт по лабораторной работе №1
по дисциплине
«Технология разработки программного обеспечения»
Выполнил: студент 5-го курса
Долматов Е.С.
Москва, 2012
Задание
Цель: обучение работе
с объектами .net remoting ObjectByValue, ObjectByReference(WellKnown(
и несколькими каналами (HTTP, OPC) в приложении.
Навыки: создание северного и клиентского приложения с использованием .net remoting
Задача:
Серверная часть:
Необходимо создать сервер .net remoting обрабатывающий запросы по каналу HTTP (порт 13000), имеющий следующую архитектуру (схематично).
т. е. необходимо создать 3 объекта .net remoting: 2 объекта WKO и 1 CAO.
Объект WKO Singleton должен выполняеть роль persistent хранилища объектов класса RecordDataObject (на схеме WellKnownSingleton) и быть доступен для клиентских запросов на извлечение данных по протоколу HTTP.
Объект CAO должен выполнять роль транзакционного кеша, хранящего измененные клиентом в течении сессии подключения объекты и их первоначальные копии (может быть реализован любой другой, более оптимальный способ хранения измененных и первоначальных данных). Объект также должен быть доступен для запросов клиента по протоколу HTTP.
Объект WKO Singlecall должен быть выполнять роль контроллера транзакции и быть доступен для клиентских вызовов по протоколу HTTP. Объект при вызове операции Commit() должен создавать Proxy объекты Singleton и CAO объектов и выполнять копирование изменных объектов из CAO в WKO Singleton по каналу IPC. При копировании должна выполняться проверка целостности данных, т. е. должно проверяться наличие и соответствие данных в WKO Singleton объекте, первоначальным данным в CAO объекте. В случае неудачи результат выполнения операции — строка ошибки(по желанию можно реализовать передачу сериализованного объекта Exception). Операция Rollback — очищает CAO объект.
Клиентская часть:
Необходимо реализовать клиента .net remoting к серверной части приложения, позволяющего в графическом режиме выполнять следующие операции: закачку списка объектов данных с серверного WKO Singleton объекта CRUD операции с объектами с записью изменений в CAO объект на сервере. Выполнение операций Commit() и Rollback() серверного объекта WKO Singlecall.
Наличие логов операций в процессе работы ПО обязательно.
Исходный код приложения
Серверная часть
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Runtime.Remoting.
using System.Runtime.Remoting.
using System.Runtime.Remoting;
namespace Server
{
class Server
{
static void Log(string message)
{
Console.WriteLine(message);
}
static void LibraryEvents_LogEvent(string message)
{
Log(message);
}
static void Main(string[] args)
{
RemotingConfiguration.
Library.Logging.LogEvent += new Library.Logging.
Console.WriteLine("Сервер запущен");
Console.ReadLine();
}
}
}
Клиентская часть
Form 1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Remoting;
using System.Threading;
namespace Client
{
public partial class ClientForm1 : Form
{
BindingList<Library.
Library.ClientActivated CAO;
Library.WellKnownSingleCall SingleCALL;
Library.WellKnownSingleton SingleTON;
public ClientForm1()
{
InitializeComponent();
try
{
RemotingConfiguration.
SingleCALL = new Library.WellKnownSingleCall();
SingleTON = new Library.WellKnownSingleton();
data = new BindingList<Library.
dataGridView1.DataSource = data;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
void добавитьToolStripMenuItem_
{
try
{
Library.RecordDataObject rec = new Library.RecordDataObject();
rec.ID = SingleTON.incID();
ClientForm2 form2 = new ClientForm2();
form2.Edit(rec);
data.Add(rec);
dataGridView1.Update();
CAO.CreateRecord(rec);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
void редактироватьToolStripMenuItem
{
try
{
Library.RecordDataObject rec = dataGridView1.SelectedRows[0].
ClientForm2 form2 = new ClientForm2();
form2.Edit(rec);
dataGridView1.Update();
CAO.UpdateRecord(rec);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void удалитьToolStripMenuItem_
{
try
{
Library.RecordDataObject rec = dataGridView1.SelectedRows[0].
data.Remove(rec);
dataGridView1.Update();
CAO.DeleteRecord(rec);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
void загрузитьДанныеToolStripMenuIt
{
try
{
data.Clear();
if (CAO == null)
{
CAO = new Library.ClientActivated();
}
List<Library.RecordDataObject> list = SingleTON.GetPersistentData();
data = new BindingList<Library.
dataGridView1.DataSource = data;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
void загрузитьКэшToolStripMenuItem_
{
try
{
string s;
listBox1.Items.Add("На
foreach (var item in CAO.inserted)
{
s = item.field1.ToString() + " " + item.field2.ToString();
listBox1.Items.Add(s);
}
listBox1.Items.Add("На
foreach (var item in CAO.updated)
{
s = item.field1.ToString() + " " + item.field2.ToString();
listBox1.Items.Add(s);
}
listBox1.Items.Add("На
foreach (var item in CAO.deleted)
{
s = item.field1.ToString() + " " + item.field2.ToString();
listBox1.Items.Add(s);
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void CommitBtn_Click(object sender, EventArgs e)
{
try
{
List<string> list = new List<string>();
list = SingleCALL.Commit(CAO);
foreach (string item in list)
{
listBox1.Items.Add(item);
}
CAO.Clear();
data.Clear();
List<Library.RecordDataObject> list2 = SingleTON.GetPersistentData();
data = new BindingList<Library.
dataGridView1.DataSource = data;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void RollbackBtn_Click(object sender, EventArgs e)
{
try
{
CAO.Clear();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
Form 2
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 Client
{
public partial class ClientForm2 : Form
{
public ClientForm2()
{
InitializeComponent();
}
private void Read(Library.RecordDataObject dr)
{
dr.field1 = textBox1.Text;
dr.field2 = textBox2.Text;
}
private void Write(Library.RecordDataObject dr)
{
textBox1.Text = dr.field1;
textBox2.Text = dr.field2;
}
public void Edit(Library.RecordDataObject dr)
{
Write(dr);
ShowDialog();
Read(dr);
}
}
}
ClientActivated
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Library
{
public class ClientActivated : MarshalByRefObject
{
public List<RecordDataObject> inserted;
public List<RecordDataObject> updated;
public List<RecordDataObject> deleted;
public ClientActivated()
{
inserted = new List<RecordDataObject>();
updated = new List<RecordDataObject>();
deleted = new List<RecordDataObject>();
Logging.Log("Создан объект ClientActivated");
}
~ClientActivated()
{
Logging.Log("Удален объект ClientActivated");
}
public void CreateRecord(RecordDataObject RecordData)
{
inserted.Add(RecordData);
Logging.Log("Запись " + RecordData.field1 + " " + RecordData.field2 + " добавлена в кэш на добавление");
}
public void UpdateRecord(RecordDataObject RecordData)
{
updated.Add(RecordData);
Logging.Log("Запись " + RecordData.field1 + " " + RecordData.field2 + " добавлена в кэш на редактирование");
}
public void DeleteRecord(RecordDataObject RecordData)
{
deleted.Add(RecordData);
Logging.Log("Запись " + RecordData.field1 + " " + RecordData.field2 + " добавлена в кэш на удаление");
}
public void Clear()
{
inserted.Clear();
updated.Clear();
deleted.Clear();
Logging.Log("Кэш очищен");
}
}
}
Logging
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Library
{
public static class Logging
{
public delegate void LogEventHandler(string message);
public static event LogEventHandler LogEvent;
public static void Log(string message)
{
if (LogEvent != null) LogEvent(message);
}
}
}
RecordDataObject
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Library
{
[Serializable]
public class RecordDataObject
{
public int ID;
public string field1 { get; set;}
public string field2 { get; set;}
public RecordDataObject() { }
public RecordDataObject(int f0, string f1, string f2)
{
ID = f0;
field1 = f1;
field2 = f2;
}
}
}
WellKnownSingleCall
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Library
{
public class WellKnownSingleCall : MarshalByRefObject
{
public WellKnownSingleCall()
{
Logging.Log("Создан объект WellKnownSingleCall");
}
~WellKnownSingleCall()
{
Logging.Log("Удален объект WellKnownSingleCall");
}
public List<string> Commit(ClientActivated CAO)
{
List<string> list = new List<string>();
Logging.Log("Копирование измененных объектов из кэша в синглтон объект");
WellKnownSingleton wks = (WellKnownSingleton)Activator.
list = wks.SetPersistentData(CAO.
Logging.Log("Копирование завершено");
return list;
}
public void Rollback(ClientActivated CAO)
{
CAO.Clear();
Logging.Log("Кэш очищен");
}
}
}
WellKnownSingleton
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Library
{
public class WellKnownSingleton : MarshalByRefObject
{
List<RecordDataObject> recordData;
int ID;
public WellKnownSingleton()
{
Logging.Log("Создан объект WellKnownSingleton");
recordData = new List<RecordDataObject>();
recordData.Add(new Library.RecordDataObject(1, "арбуз", "ананас"));
recordData.Add(new Library.RecordDataObject(2, "Ваня", "Саша"));
recordData.Add(new Library.RecordDataObject(3, "белки", "мыши"));
recordData.Add(new Library.RecordDataObject(4, "лампочки", "батарейки"));
recordData.Add(new Library.RecordDataObject(5, "0101001", "01010101"));
recordData.Add(new Library.RecordDataObject(6, "мандарины", "киви"));
recordData.Add(new Library.RecordDataObject(7, "сладость", "радость"));
recordData.Add(new Library.RecordDataObject(8, "кучка", "две кучки"));
Информация о работе Программное обеспечение вычислительной техники и автоматизированных систем