Программное обеспечение вычислительной техники и автоматизированных систем

Автор работы: Пользователь скрыл имя, 18 Февраля 2013 в 21:39, лабораторная работа

Краткое описание

Цель:. Обучение работе с объектами NET Remoting ObjectByValue, ObjectByReference (WellKnown ( Singleton, SingleCall), ClientActivated) и несколькими каналами (HTTP, OPC) в приложении.
Навыки:. Создание северного и клиентского приложения с использованием NET Remoting
Задача: Серверная часть: Необходимо создать сервер. NET Remoting обрабатывающий запросы по каналу HTTP (порт 13000), имеющий следующую архитектуру (схематично).

Вложенные файлы: 1 файл

лаба1.doc

— 149.00 Кб (Скачать файл)

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ  УНИВЕРСИТЕТ

ПРИБОРОСТРОЕНИЯ  И  ИНФОРМАТИКИ


 

 

Кафедра ИТ-6 «Управление  и моделирование систем»

 

Специальность 230105

«Программное обеспечение  вычислительной техники и автоматизированных систем»

 

 

 

 

 

 

 

 

 

 

 

 

Отчёт по лабораторной работе №1

по  дисциплине

«Технология разработки программного обеспечения»

 

 

 

 

 

 

 

Выполнил:     студент 5-го курса

Долматов Е.С.

                                      Шифр: 08216ИТ6

 

             

 

 

 

 

 

 

 

 

 

Москва, 2012

 

Задание

 

Цель: обучение работе с объектами .net remoting ObjectByValue, ObjectByReference(WellKnown(Singleton,Singlecall), ClientActivated)

 и несколькими каналами (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.Channels.Http;

using System.Runtime.Remoting.Channels;

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.Configure("Server.exe.config", false);

            Library.Logging.LogEvent += new Library.Logging.LogEventHandler(LibraryEvents_LogEvent);

            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.RecordDataObject> data;

        Library.ClientActivated CAO;

        Library.WellKnownSingleCall SingleCALL;

        Library.WellKnownSingleton SingleTON;

 

 

        public ClientForm1()

        {

            InitializeComponent();

            try

            {

               RemotingConfiguration.Configure("Client.exe.config", false);

 

                SingleCALL = new Library.WellKnownSingleCall();

                SingleTON = new Library.WellKnownSingleton();

               

                data = new BindingList<Library.RecordDataObject>();

                dataGridView1.DataSource = data;

            }

            catch (System.Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

 

        private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)

        {

            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_Click(object sender, EventArgs e)

        {

            try

            {

                Library.RecordDataObject rec = dataGridView1.SelectedRows[0].DataBoundItem as Library.RecordDataObject;

                ClientForm2 form2 = new ClientForm2();

                form2.Edit(rec);

                dataGridView1.Update();

                CAO.UpdateRecord(rec);

            }

            catch (System.Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                Library.RecordDataObject rec = dataGridView1.SelectedRows[0].DataBoundItem as Library.RecordDataObject;

                data.Remove(rec);

                dataGridView1.Update();

                CAO.DeleteRecord(rec);

            }

            catch (System.Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        private void загрузитьДанныеToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                data.Clear();

                if (CAO == null)

                {

                    CAO = new Library.ClientActivated();

                }

                List<Library.RecordDataObject> list = SingleTON.GetPersistentData();

                data = new BindingList<Library.RecordDataObject>(list);

                dataGridView1.DataSource = data;

            }

            catch (System.Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        private void загрузитьКэшToolStripMenuItem_Click(object sender, EventArgs e)

        {

            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.RecordDataObject>(list2);

                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.GetObject(typeof(WellKnownSingleton), "ipc://ServIPC/WellKnownSingleton.soap");

 

            list = wks.SetPersistentData(CAO.inserted, CAO.updated, CAO.deleted);

 

            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, "кучка", "две кучки"));

Информация о работе Программное обеспечение вычислительной техники и автоматизированных систем