Программа по оптимизации передачи данных через сервер

Автор работы: Пользователь скрыл имя, 20 Августа 2013 в 23:24, дипломная работа

Описание работы

Актуальность моей работы заключается в создании инструмента для разработки приложений, связанных между собой по сети и работающих как единая система.
Сейчас распространена клиент-серверная сетевая архитектура, в которой задания или сетевая нагрузка распределены между поставщиками услуг (сервисов), называемыми серверами, и заказчиками услуг, называемыми клиентами. Нередко клиенты и серверы взаимодействуют через компьютерную сеть и могут быть как различными физическими устройствами, так и программным обеспечением.

Содержание работы

Введение 3
Глава 1. Оптимизация приложений 6
1.1 Механизмы оптимизации 6
1.2 Архитектурный принцип построения сетей 9
1.3 Пропускная способность сети 11
1.4 Поток данных 12
1.5 Гибридные сети 20
1.6 Брэндмауэр Windows 22
1.7 Отличие С# от Java 24
1.8 JSON. Передача объектов 36
Глава 2. Программная часть 38
2.1 Среда разработки 38
2.2 Язык программирования 39
2.3 Диаграммы классов 40
2.4 Диаграммы взаимодействия 43
2.5 Алгоритм работы 45
2.6 Интерфейс приложения 47
Заключение 49
Список использованной литературы 50

Файлы: 1 файл

Диплом.docx

— 1.24 Мб (Скачать файл)

В C# примитивные  типы (byte, int, double, float, bool и пр.) и структуры (struct) передаются по значению (т. н. значимые типы), остальные типы передаются по ссылке (т. н. ссылочные типы). C# также  поддерживает явное описание передачи параметров по ссылке (ключевые слова ref и out). При использовании out компилятор контролирует наличие в методе присваивания значения. В Java примитивные типы (численные/boolean) передаются по значению, а для остальных (обьектные) по значению передается ссылка на обьект.

 

Виртуальность методов:

C# копирует  концепцию виртуальных методов  C++: виртуальный метод должен быть  явно объявлен с ключевым словом virtual, прочие методы виртуальными  не являются. C# требует явного  объявления о перекрытии виртуального  метода в производном классе  ключевым словом override. Если требуется  скрыть (hide) виртуальный метод, то  есть просто ввести новый метод  с тем же именем и сигнатурой, требуется указать ключевое слово  new (в случае отсутствия которого  компилятор выдаёт предупреждение). Запрещается заслонять абстрактные  методы. Объявление override-метода с  ключевым словом sealed запрещает переопределять (override) этот метод в классах-потомках, однако по-прежнему позволяет  скрыть его.

 

В Java, наоборот, все открытые методы, кроме статических, являются виртуальными, а переопределить метод так, чтобы механизм виртуальности  не включился, невозможно. Метод всегда виртуально перекрывает метод базового класса с теми же именем и сигнатурой, если он есть. Ключевое слово final позволяет  запретить создание метода с такой  же сигнатурой в производных классах.

Подход Java синтаксически проще, он гарантирует, что всегда вызывается метод именно того класса, к которому относится  объект. С другой стороны, виртуальность  действительно нужна не всегда, а  накладные расходы на вызов виртуальных  методов несколько больше, поскольку  эти вызовы обычно не проходят инлайн-подстановку  и требуют дополнительного обращения  к таблице виртуальных методов (хотя некоторые реализации JVM, включая  реализацию Sun, реализуют инлайн-подстановку  наиболее часто вызываемых виртуальных методов).

Виртуальность всех методов потенциально небезопасна: если программист по ошибке объявит  метод, который уже есть в базовом  классе, не имея намерения его перекрывать, а просто не обратив внимания на то, что такой метод уже есть, то новый метод перекроет одноимённый метод в базовом классе, хотя это и не входит в намерения разработчика. В C# подобная ошибка тоже возможна, но компилятор выдаст предупреждение, что перекрывающий метод объявлен без new и override. В Java 5 появился аналогичный механизм — если метод перекрывает виртуальный метод класса-предка, компилятор выдаёт предупреждение; чтобы предупреждение не выдавалось, необходимо отметить перекрывающий метод аннотацией «@Override».

 

Параметризованные (обобщённые) типы:

В обоих  языках типы могут быть параметризованными, что поддерживает парадигму обобщённого  программирования. Синтаксически определение  типов достаточно близко — в обоих  языках оно унаследовано от шаблонов (templates) C++, хотя и с некоторыми модификациями.

Обобщения типов в Java являются чисто языковой конструкцией и реализованы лишь в компиляторе. Компилятор заменяет все обобщённые типы на их верхние  границы и вставляет соответствующее  приведение типов в те места, где  используется параметризируемый тип. В результате получается байт-код, который  не содержит ссылок на обобщённые типы и их параметры. Такая техника  реализации обобщённых типов называется затиранием типов (type erasure). Это означает, что информация об исходных обобщённых типах во время выполнения недоступна, и обусловливает некоторые ограничения, такие как невозможность создавать  новые экземпляры массивов из аргументов обобщённого типа. Среда выполнения Java не знакома с системой обобщённых типов, вследствие чего новым реализациям JVM понадобились лишь минимальные обновления для работы с новым форматом классов.

C# пошёл  другим путём. Поддержка обобщённости  была интегрирована в саму  виртуальную среду выполнения, впервые  появившись в .NET 2.0. Язык здесь стал лишь внешним интерфейсом для доступа к этим возможностям среды. Как и в Java, компилятор производит статическую проверку типов, но в дополнение к этому JIT производит проверку корректности во время загрузки. Информация об обобщённых типах полностью присутствует во время выполнения и позволяет полную поддержку рефлексии обобщённых типов и создание их новых реализаций.

Подход Java требует дополнительных проверок во время выполнения, не гарантирует, что клиент кода будет следовать  соответствию типов, и не обеспечивает рефлексии для обобщённых типов. Java не позволяет специализировать обобщённые типы примитивными (это можно сделать  только заворачивая примитивные  типы в классы), в то время как C# обеспечивает обобщение как для  ссылочных типов, так и для  типов-значений, включая примитивные. Вместо этого Java предлагает использование  завёрнутых примитивных типов в  качестве параметров (напр., List<Integer> вместо List<int>), но это даётся ценой  дополнительного выделения динамической памяти. Как в Java, так и в C# специализации  обобщённого типа на разных ссылочных типах дают одинаковый код , но для C# среда выполнения динамически генерирует оптимизированный код при специализации на типах-значениях (например, List<int>), что позволяет их хранить и извлекать из контейнеров без операций за- и разворачивания.

 

Пространства имён, сборки, пакеты:

C# использует  пространства имён (namespace), напоминающие  одноимённый механизм C++. Каждый  класс относится к некоторому  пространству имён, те классы, для  которых пространство имён не  указано явно, относятся к безымянному  пространству имён по умолчанию.  Пространства имён могут быть  вложенными друг в друга.

В Java имеются  пакеты, отчасти похожие на пространства имён C#. Пакеты могут быть вложенными, каждый описываемый класс относится  к некоторому пакету, при отсутствии явного указания пакета класс относится к глобальному безымянному пакету.

В обоих  языках для обращения к объекту, объявленному в другом пространстве имён или пакете, нужно объявить в программе требуемый пакет (пространство имён) как используемый. Обращение  к объекту производится через  квалифицированное имя, в качестве квалификатора используется имя  пакета (пространства имён). Если требуется  обращение к объекту без квалификации, программный модуль должен содержать  директиву разыменования: using в C# и import в Java.

В C# пространства имён никак не связаны с компилированными модулями (сборками, или assembly в терминологии Microsoft). Несколько сборок могут содержать  одно и то же пространство имён, в  одной сборке может объявляться  несколько пространств имён, не обязательно  вложенных. Модификаторы области видимости C# никак не связаны с пространствами имён. В Java объявленные в одном  пакете классы по умолчанию образуют единый компилированный модуль. Модификатор  области видимости по умолчанию (отсутствие явного указания) ограничивает область видимости полей и  методов класса пределами пакета.

В Java структура  файлов и каталогов исходных текстов  пакета по умолчанию связана со структурой пакета — пакету соответствует каталог, входящим в него подпакетам — подкаталоги  этого каталога, файлы исходных текстов  располагаются в каталогах, соответствующих  пакету или подпакету, в который  они входят. Таким образом, дерево исходных текстов повторяет структуру  пакета. В C# местонахождение файла  с исходным текстом никак не связано  с его пространством имён.

 

Расположение исходного текста в файлах:

В C# классы могут располагаться в файлах произвольным образом. Имя файла  исходного кода никак не связано  с именами определяемых в нём  классов. Допускается расположить  в одном файле несколько общедоступных (public) классов. Начиная с версии 2.0, C# позволяет также разбить класс на два и более файла (ключевое слово partial). Последняя особенность активно используется визуальными средствами построения интерфейса: часть класса, в которой находятся поля и методы, управляемые конструктором интерфейса, выделяются в отдельный файл, чтобы не загромождать автоматически генерируемым кодом файл, непосредственно редактируемый программистом.

В Java каждый файл может содержать только один общедоступный (public) класс, причём Java требует, чтобы имя файла совпадало  с именем этого класса, что исключает  путаницу в именах файлов и классов. Более того, согласно рекомендуемому Sun соглашению об оформлении кода, размер файла исходного кода не должен превышать 2000 строк кода, поскольку в файле  большего размера труднее разбираться. Большой размер файла также считается  признаком плохого проектирования.

 

Исключения:

Оба языка  поддерживают механизм обработки исключений, синтаксически оформленный совершенно одинаково: в языке имеется оператор генерации исключения throw и блок обработки исключений try{}catch(){}finally{}, обеспечивающий перехват возникших  внутри блока исключений, их обработку, а также гарантированное выполнение завершающих действий.

Java поддерживает  проверяемые (checked) исключения: программист  должен явно указать для каждого  метода типы исключений, которые  метод может выбросить, эти  типы перечисляют в объявлении  метода после ключевого слова  throws. Если метод использует методы, выбрасывающие проверяемые исключения, он должен либо явно перехватывать  все эти исключения, либо содержать  их в собственном описании. Таким  образом, код явно содержит  перечень исключений, которые могут  быть выброшены каждым методом.  Иерархия типов исключений содержит  также два типа (RuntimeException и Error), наследники которых не являются  проверяемыми и не должны описываться. Они выделены для исключений времени выполнения, которые могут возникнуть в любом месте, либо обычно не могут быть обработаны программистом (например, ошибки среды исполнения), и не должны указываться в объявлении throws.

C# проверяемые  исключения не поддерживает. Их  отсутствие является сознательным  выбором разработчиков. Андерс  Хейлсберг, главный архитектор C#, считает, что в Java они были  в какой-то степени экспериментом и себя не оправдали .

Вопрос  о пользе проверяемых исключений дискуссионный.

 

Параллельное программирование:

В целом  механизмы параллельного программирования в C# аналогичны тем, что предоставляет Java, различие состоит в деталях  реализации. В обоих случаях имеется  библиотечный класс Thread, реализующий  понятие «потока». Java предоставляет  два способа создания собственных  потоков: либо путём расширения класса Thread, либо путём реализации интерфейса Runnable. В обоих случаях программист  должен определить наследуемый (входящий в интерфейс) метод run(), содержащий тело потока — код, который будет в  нём выполняться. C# вместо этого  использует механизм делегатов: для  создания потока создаётся экземпляр  стандартного класса Thread, которому передаётся в виде параметра конструктора делегат, содержащий метод — тело потока.

В обоих  языках есть возможность создать  синхронно исполняемый блок кода; в Java это делается с помощью оператора synchronized(), в C# — оператором lock(). В Java имеется также возможность объявлять  синхронные методы, используя модификатор synchronized в заголовке описания метода. Такие методы при исполнении блокируют  свой объект-хозяин (таким образом, из синхронизированных методов класса, для одного и того же экземпляра, одновременно может выполняться  только один, остальные будут ждать). Аналогичная возможность в .NET реализуется с помощью атрибута реализации метода MethodImplAttribute MethodImplOptions.Synhronized, но, в отличие от Java, эта возможность формально не является частью языка C#.

В обоих  языках доступны также идентичные средства синхронизации, основанные на отправке и ожидании сигнала от одного потока к другому (другим). В Java это методы notify(), notifyAll() и wait(), в C# — методы Pulse(), PulseAll(), Wait() (тройки методов функционально  попарно аналогичны). Различие состоит  лишь в том, что в Java эти методы (и, соответственно, функциональность монитора) реализуется в классе Object, поэтому для синхронизации не требуется никаких дополнительных библиотек, а в C# эти методы реализованы  как статические в отдельном  библиотечном классе Monitor. В C# стандартная  библиотека содержит также несколько  дополнительных примитивов синхронизации  параллельного исполнения потоков: мьютексы, семафоры, синхронизирующие таймеры. С версии 1.5 в JDK SE включены пакеты java.util.concurrent, java.util.concurrent.atomic и java.util.concurrent.locks содержащие исчерпывающий набор  средств для реализации параллельных вычислений.

Исходя  из всего вышеперечисленного для  программирования приложений под windows мною был выбран язык C#. Я считаю, что он наиболее подходит для реализации поставленных задач.

 

1.8 JSON. Передача объектов

JSON изначально разрабатывался для удобной передачи объектов. В моем клиенте он для этого и используется. Т.к. в .NET все представлено объектами, то чтобы не писать свой парсер принимаемых данных, задача по сериализации\десериализации объектов переложена на JSON.

JSON (JavaScript Object Notation) - простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript, определенного в стандарте ECMA-262 3rd Edition - December 1999. JSON - текстовый формат, полностью независимый от языка реализации, но он использует соглашения, знакомые программистам C-подобных языков, таких как C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.

Коллекция пар ключ/значение. В разных языках, эта концепция реализована как объект, запись, структура, словарь, хэш, именованный список или ассоциативный массив.

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