Система разработки структурных и функциональных схем технического обеспечения промышленной автоматизации
Министерство
образования и науки Российской Федерации
Тульский
государственный университет
Кафедра
вычислительной техники
БАКАЛАВРСКАЯ
РАБОТА
направление
230100
«Информатика
и вычислительная техника»
Система
разработки структурных и функциональных схем технического обеспечения
промышленной автоматизации
Студент группы
220201
Алексеев А.Д
Руководитель работы
Савин Н.И.
Оглавление
Введение
Анализ
задачи проектирования
Анализ
технического задания
Описание
системы и ее назначение
Обзор
существующих решений
Обзор
средств создания приложений
Языки
низкого уровня
Технологии
создания приложений на платформе .NET
Обзор
средств создания серверной части приложения
Язык
программирования Java
Выбор
средства создания серверной части приложения
Обзор
систем управления базами данных
СУБД
MySQL
СУБД
Oracle
СУБД
Microsoft SQL Server
Выбор
системы управления базами данных
Постановка
задачи
Входные
данные
Требования
к системе
Проектирование
архитектуры системы
Алгоритмическое
проектирование
Протокол
регистрации и авторизации пользователей
Регистрация
учетной записи администратора
Регистрация
учетной записи тимлидера
Авторизация
пользователей
Алгоритм
реализации системы разделения и планирования задач
Логическое
проектирование
Общая
структура и схема работы разрабатываемой системы
Структура
базы данных
Инфологическое
проектирование базы данных
Логическое
проектирование базы данных
Графический
интерфейс
Описание
классов
Технологический
раздел
Руководство
пользователя
Библиографический
список
Приложение.
Листинг программы
Введение
Грамотная
организация рабочих процессов при разработке программного обеспечения - один из
важнейших факторов быстрой и успешной разработки хорошего программного
продукта. В настоящее время, быстрая разработка программного обеспечения в большей
степени зависит от согласованности членов команды, нежели чем от личного
профессионализма разработчиков. Обычно, в хорошо организованных компаниях
планированием и организацией процесса разработки занимаются менеджеры, в задачи
которых входит постановка и контроль за выполнением задач, чтобы выполнение
проекта укладывалось в сроки. Но как быть малым компаниям, которые пока не
могут позволить себе услуги менеджеров, но хотят быстро и результативно
разрабатывать конкурентоспособное программное обеспечение?
Безусловно,
можно заниматься реализацией проектов без четкого плана - в этом случае каждый
член команды пишет какой-то участок кода, а потом результаты собираются
воедино. Но отсутствие централизованного контроля за работой каждого из них
может привести к не очень хорошим последствиям - например, разработчик
использовал стороннюю библиотеку в своем коде, а при сборке проекта ее
отсутствие обнаруживается очень поздно, что ведет к затратам времени на поиск
этой неочевидной проблемы.
В
другом случае, разработчики, которые только недавно собрались вместе,
используют разные соглашения о именовании переменных, пространств имен, в этом
случае разделение участков кода между ними может привести к тому, что придется
заниматься исследованием кода на предмет совпадающих имен переменных и их
исправление. При сохранении хорошего стиля кода, этот процесс может отнять
львиную долю времени.
В
связи с этими недостатками, присутствующими в малых командах, актуальным
является разработка программного обеспечения, облегчающего работу тимлидера и
всех членов команды, и способствующего более эффективному участию разработчиков
в процессе разработки программного обеспечения.
С
целью улучшения качества процесса разработки, в данном дипломном проекте будет
реализовано клиент-серверное приложение, именуемое как «Программное обеспечение
для планирования и организации рабочих процессов в мобильных группах
разработчиков ПО», которое позволит быстро начать разработку программного
обеспечения , контролировать процесс разработки, и собирать все результаты
воедино. Разрабатываемая система должна разделять пользователей на 3категории:
лидер команды, разработчик и администратор и обеспечивать разграничение прав
доступа между ними.
Анализ
задачи проектирования
Анализ
технического задания
Разрабатываемая
система представляет собой автоматизированную систему разделения задач между
разработчиками:
персональных
компьютеров, объединенных в локальную или глобальную сеть, в том числе с
использованием протокола беспроводной передачи данных wi-fi;
Система
должна быть разработана с учетом следующих ограничений:
выполнение
клиентского приложения в среде, которая должна устанавливаться на компьютерах
разработчиков в без дополнительных настроек;
простота
использования системы, отсутствие требований специальных технических знаний по
конфигурированию локальной сети от разработчиков программного обеспечения;
Исходя
из технического задания, разрабатываемая система должна решать следующие
задачи.
предоставлять
удобный и интуитивно понятный в обращении интерфейс;
разграничивать
права для доступа пользователей в систему;
давать
возможность регистрироваться новым пользователям;
давать
возможность отправлять всем пользователям текстовые сообщения;
Разделять
при создании проекта его модули между разными разработчиками;
давать
возможность разработчикам отсылать результаты своей работы на сервер,
автоматически собирать полученные модули в одно решение;
давать
возможность вести резервное копирование данных;
давать
возможность контролировать изменения, вносимые каждым разработчиком, вести
журнал правок;
давать
лидеру команды возможность назначать приоритет задач и контролировать
выполнение проекта;
давать
возможность тестировать программы, которые пишутся разработчиками;
С
учетом выполняемых функций, проектируемую систему можно разделить на несколько
взаимосвязанных друг с другом модулей:
модуль
регистрации;
модуль
администрирования;
модуль
реализации «системы обмена данными»;
серверный
модуль (его роль будет выполнять компьютер лидера команды).
Модуль
реализации «системы обмена данными» включает в себя следующие модули:
модуль
списка разработчиков;
модуль
обмена данными;
модуль
панели инструментов;
модуль
чата.
Такое
условное разделение программы на модули позволит составить более полное и
наглядное описание функциональности каждого из них, а также схемы их
взаимодействия.
Описание
системы и ее назначение
Разрабатываемая
система представляет собой приложение для организации и контроля разработки
программного обеспечения, значительно сокращая сроки разработки программных
продуктов, оптимизирующая процесс разработки, делая его более быстрым и
прозрачным, лишая его таких минусов, присущих крупным компаниям, как например
излишняя бумажная волокита, связанная с постоянным утверждением и изменением
списка задач. Разрабатываемый программный продукт позволит разработчикам по
мере создания нового проекта сразу приступать к реализации проекта,
способствует взаимодействию и взаимопомощи разработчикам в процессе разработки,
быстрому и эффективному обнаружению и устранению проблемных мест проекта и
«подводных камней». Также система будет позволять тимлидеру в режиме реального
времени видеть состояние работ над проектом, оценивать такие параметры, как
общая и личная эффективность сотрудников, позволит автоматически либо путем
выбора разделять задачи между разработчиков. Исходя из критериев оценки
эффективности сотрудников сможет формировать картину «специализации» каждого
конкретного человека с целью дальнейшего распределения задач с учетом этого
критерия(при автоматическом распределении задач система будет стремиться
назначать разработчикам те задачи ,с которыми они справляются наиболее
эффективно). Это позволит существенно снизить сложность оценки первоначальных
временных затрат. Тимлидер получит возможность видеть общую картину проекта,регулировать
процесс разработки, при необходимости сможет направить усилия на реализацию
наиболее важных частей продукта, например библиотеку, которая будет
использоваться всем проектом. Также разрабатываемое решение должно иметь
возможность создания отчетов по работе над проектом, который будет включать в
себя общую трудоемкость реализации решения и время реализации каждой отдельной
части проекта.
Приложение
будет состоять из двух частей - первая представляет собой сервер, запущенный на
машине руководителя команды, который будет состоять из системы планирования,
разделения и организации задач между разработчиками, базы данных, в которой
будет храниться необходимая служебная информация, например такая как роли
разработчиков, списки проектов, текущие задачи и так далее. Более подробно
структура базы данных будет освещена в соответствующем разделе.
Клиентская
часть будет представлять собой приложение, запускаемое на компьютерах
разработчиков, в его функции будет входить прием новых/отправка решеных задач,
оценка производительности разработчиков и модуль командного взаимодействия(чат
разработчиков и обсуждение проблемных задач, где разработчик может попросить
совета у другого члена команды, или приложить кусок кода, который у него не
реализовывается, другой член сможет помочь ему советом).
Обзор
существующих решений
В
процессе исследования и разработки данного решения были проанализированы уже
разработанные программные продукты, обладающие сходными возможностями. В
процессе изучения существующих решений было найдено два похожих приложения,
решающих близкий спектр задач. Первым из них стала программа LeaderTask,
разрбатываемая компанией «ОранайзерЛидерТаск». Ее возможности следующие:
ведение
ежедневника, позволяющего создавать список дел и задач, как для одного
человека, так и для предприятия;
планировщик
задач;
инфо-менеджер,
облегчающий обработку личной информации(аналог мини-органайзера);
возможность
создания списка контактов;
возможность
создания напоминаний и заметок;
возможность
запуска на мобильных платформах(Андроид, Ipod) и синхронизация данных, наличие
облачного хранилища для каждого пользователя программы, где хранится база
данных всех задач;
Поддержка
современных технологий управления временем и рабочими процессами, такие как
«GTD», «Do It Tomorrow», «AutoFocus»
Из
преимуществ программы можно выделить следующие:
Различные
виды объектов и задач. Разделение задач по категориям. Иерархичная структура
задач(возможность деления большой задачи на несколько более простых);
Возможность
сортировки, фильтрации и выборки необходимых задач по множеству критериев;
Возможность
создавать повторяемые задачи;
Возможность
настройки интерфейса под определенные пользовательские предпочтения;
Гибкая
настройка интерфейса;
Структурирование
задач.
Также
были проанализированы недостатки программы. Можно выделить следующие
недостатки:
Начиная
с последних версий программы для работы необходим постоянный доступ в интернет,
что ограничивает возможности использования программы;
Нет
возможности синхронизации контактов с популярными сервисами;
Программа
больше ориентирована на организацию и планирование задач отдельного человека,
взаимодействие групп людей присутствует, но не выраженно в достаточной степени
и не учитывает специфику выбранной области(разработка программных продуктов);
Ограниченное
место в облачном хранилище данных;
Платность
программы. Не стандартный для подобных продуктов способ оплаты - регулярная
абонентская плата.
Вторая
рассматриваемая программа называется ProcessMarker, выпускаемая фирмой Colosa
Inc. Этот программный продукт ориентирован на организацию и планирование бизнес
процессов в крупных организациях. Возможности программы позволяют
организовывать, запускать, контроллировать выполнение бизнес процессов, причем
делает этот процесс интуитивно простым и понятным. Позволяет вносить изменения
в бизнес-процесс «на лету». Позволяет генерировать разнообразные отчеты и
диаграммы, которые будут отражать эффективность ,временные затраты, качество
выполнения работ; управлять срокамиз завершения процессов и многое другое.
Из
преимуществ данной программы можно выделить следующие:
Карта
процессов. Интерфейс создания и управления процессами прост и нагляден,
реализован по принципу «drag and drop». Создание процесса занимает считанные
минуты;
Динамическое
построение и взаимодействие процессов отражает все процессы организации и их
взаимосвязь.
Расширяемость
интерфейса. Он построен на технологиях javascript и css, что позволяет
технически грамотным специалистам изменять стандартные компоненты и добавлять
новые;
Поддержка
бизнес ролей;
Наличие
API. С программой можно взаимодействовать по протоколу SOAP. Приложение
предоставляет базовый стандартный интерфейс для этого взаимодействия.
Управление
документооборотом. Файловая система позволяет легко хранить необходимые файлы,
связанные с каждым конкретным процессом и при необходимости восстанавливать
случайно удаленные данные.
Минусами
этой программы являются следующие:
Достаточно
большое количество ошибок в процессе работы программы, вследствие чего
возможная нестабильность и частые обновления;
Программа
ориентирована на большие компании;
Процесс
развертывания и интеграции достаточно сложен;
Платность;
Программа
не учитывает специфику выбранной области и является более общим решением;
Исходя
из вышеперечисленного был сделан вывод, что разрабатываемый программный продукт
будет нужным образом расширять функционал данных программ , учтет отсутствующие
в них возможности.
Обзор
средств создания приложений
Исходя
из поставленной задачи, для разработки программного продукта потребуются средства
создания клиент-серверных приложений. Для окончательного выбора этих средств
необходимо провести сравнительный анализ возможностей различных технологий и
имеющихся в распоряжении функций (или классов), облегчающих решение указанных
задач.
На
данном этапе развития сети Интернет существует ряд языков и технологий для
создания клиент-серверных приложений.
Языки
«низкого» уровня(С/C++)
Технология
ASP.NET..
Языки
низкого уровня.
Среди
языков условно низкого уровня, распространены такие, как С и С++. Благодаря
механизму указателей и доступу к API операционной системы, они обеспечивают
достаточно гибкие возможности при разработке приложений, с использованием
механизма сокетов, для организации сетевого взаимодействия. Но разработка на
них будет сопряжена с определенными трудностями, как правило качество
программного продукта на этих языках прямо пропорционально квалификации
разработчика.
Си
(англ.
<#"785448.files/image001.gif">Рис. 1.1.
Структура среды для проведения практических занятий
Таким образом, «Программное обеспечение
организации рабочих процессов в мобильных группах разработчиков ПО»
представляет собой модульную систему, которая состоит из клиентского приложения
предоставляющего визуальный интерфейс пользователю, серверного приложения,
обслуживающего клиентов и реализующего пересылку данных между ними двумя
методами: сокетами (для небольших сообщений) и асинхронным методом (для больших
сообщений, например скриншотов) и базы данных, находящейся на сервере.
Клиентское и серверное приложения могут взаимодействовать по локальной сети,
беспроводной локальной сети, что позволяет организовывать для программистов ,
которые видят друг друга в первый раз быстрое включение в работу, без
необходимости выделения отдельных рабочих станций и затрат времени на установку
и конфигурирование нужных программных продуктов.
Входные данные
Для разрабатываемой системы входными данными
будут являться файлы проекта на выбранном языке программирования. После
создания проекта, указывается папка, в которой содержится решение, получается
список файлов. После этого этот список обрабатывается и рассылается
разработчикам.
Требования к системе
Разрабатываемый программный продукт должен
удовлетворять следующему списку требований:
предоставлять удобный и интуитивно понятный в
обращении интерфейс позволяющий быстро и удобно выбрать реализуемый проект и
отправить его на реализацию без лишних промежуточных шагов;
разграничивать права для доступа пользователей в
систему, разделять пользователей на следующие роли: администратор, руководитель
разработки, разработчик;
давать возможность регистрироваться новым
пользователям(по умолчанию при добавлении каждого нового компьютера в локальной
сети, ему присваиваются права разработчика);
давать возможность отправлять всем пользователям
текстовые сообщения, возможность пользователям общаться между собой,
публиковать список затруднений в процессе разработки, проводить коллективное
обсуждение проблем;
Разделять при создании проекта его модули между
разными разработчиками;
давать возможность разработчикам отсылать
результаты своей работы на сервер, автоматически собирать полученные модули в
одно решение;
давать возможность вести резервное копирование
данных;
давать возможность контролировать изменения,
вносимые каждым разработчиком, вести журнал правок;
давать лидеру команды возможность назначать
приоритет задач и контролировать выполнение проекта;
давать возможность тестировать программы,
которые пишутся разработчиками;
Оценивать эффективность разработки, планировать
временные затраты на реализацию проекта, разделять задачи по разработчикам в
зависимости от их эффективности над задачами определенного типа;
Формировать отчеты о проделанной работе
Проектирование архитектуры системы
Алгоритмическое проектирование
Для обеспечения реализации требуемого
функционала в программе используются следующие алгоритмы: Алгоритм разделения
задач между разработчиками, алгоритм получения и обновления списка разработчиков,
алгоритм выполнения графика работ, алгоритм расчета эффективности
разработчиков, алгоритм определения задач, подходящих каждому разработчику,
алгоритм генерации отчетов. Рассмотрим основные из этих задач более подробно.
Алгоритм разделения задач между разработчиками
Для эффективного разделения задач между
разработчиками необходимо выполнить следующие действия:
Получить список файлов проекта, который
планируется реализовывать в настоящий момент;
Получить список компьютеров в локальной сети,
определить разработчиков, свободных на данный момент от задач. Занести этот
список компьютеров в базу данных;
Сопоставить роли разработчиков и файлов проекта.
Необходимо произвести поиск задач, подходящих разработчикам в зависимости от их
специализации. Например проектирование интерфейса базы данных необходимо
поручать разработчику, который преуспевает именно в этом направлении. На этом
шаге необходимо учитывать общее количество файлов проекта, стремясь
распределить задачи наиболее сбалансированно;
После составления отношений вида
разработчик->список файлов необходимо произвести отправку нужных файлов на
компьютеры каждого разработчика ;
Закрепить полученные задачи за разработчиками,
для этого необходимо после завершения передачи файлов записать в базу данных
разработчиков и их задачи с указанием времени начала работ;
После получения файлов разработчики оценивают
ожидаемую трудоемкость процесса реализации , это время пересылается на сервер и
заносится в базу данных;
По завершении реализации принять готовые файлы
на сервер разработки, запомнив время, затраченное на реализацию, сохранить
полученные данные в истории проектов.
Более наглядно этот алгоритм можно отразить на
следующей блок-схеме:
Рис.1. Алгоритм разделения задач
между разработчиками.
Алгоритм получения и обновления списка
разработчиков
Для работы программы необходимо в режиме
реального времени получать и обновлять список всех компьютеров, на которых
запущена клиентская версия данной программы для того, чтобы эффективно
заниматься распределением задач. Этот процесс выглядит следующим образом:
приложение программный алгоритм
Запустить сервер в режиме ожидания поступления
входящих запросов;
При запуске клиентской части приложения посылать
запрос на сервер, что клиентская часть запущена;
При получении этого сигнала на сервере занести
ip адрес этого компьютера в базу данных, с последующим присвоением ему
определенного статуса (свободен или занят решением какой-либо задачи)
При отключении каких либо компьютеров выполнять
обновление информации в базе данных о текущем состоянии компьютеров.
Алгоритм расчета эффективности каждого
разработчика.
Для расчета коэффициента эффективности
отдельного разработчика необходимо выполнить следующие действия: Выбрать всех
разработчиков одного класса задач, рассчитать среднее время выполнения задачи
одинакового масштаба и сравнить время, затраченное на реализацию задачи каждым
разработчиком. Исходя из полученных значений, полученное число будет отражать
эффективность каждого работника.
Алгоритм определения задач, подходящих каждому
разработчику
Для определения задач, наиболее подходящих
каждому разработчику необходимо выполнить следующие действия:
Оценить трудоёмкость задачи. Это необходимо для
того, чтобы более трудоёмкие задачи направлялись бы на реализацию самым
эффективным сотрудникам;
В зависимости от класса задачи, подобрать
наиболее подходящую группу разработчиков, среди которых будет происходить поиск
исполнителя;
Выбрать всех не занятых разработчиков, сравнить
их личную эффективность, при этом учесть приоритет задачи;
Отправить задачу на реализацию наиболее
подходящему разработчику, внести данные о предварительной и фактической
трудоемкости в базу данных, для возможности поиска и коррекции ошибок в
расчетах алгоритма, если вдруг он окажется не оптимальным;
Откорректировать полученные ошибки;
Этот процесс будет отражать следующая
блок-схема:
Рис. 2.Алгоритм автоматического
назначения задач
Алгоритм генерации отчетов
Этот алгоритм выполняет следующую задачу:
в процессе выполнения работ он подсчитывает время, затраченное каждым
разработчиком на реализацию задач, записывает проблемы, с которыми столкнулись
разработчики в процессе реализации, ведет учет дополнительных затрат,
необходимых в процессе разработки, например приобретение сторонних библиотек
для использования в проекте. Все эти данные заносятся в базу данных и по
завершении проекта по ним генерируется отчет.
Протокол регистрации и авторизации
пользователей
Подсистема регистрации выполняет
функцию регистрации новых пользователей. Поскольку разрабатываемая
автоматизированная система допускает наличие 3 видов пользователей:
администратор,тимлидер и разработчик, необходимо формализовать порядок
регистрации нового пользователя каждого типа.
Регистрация учетной записи
администратора
По соображениям безопасности данная
возможность не включена в подсистему регистрации, то есть из графического
интерфейса пользователя невозможно создать новую учетную запись администратора.
Учетная запись администратора «вшита» в программный код, администратор имеет
возможность изменять свой пароль.
Регистрация учетной записи тимлидера
Для того, чтобы ограничить
возможность создания учетной записи тимлидера, был реализован модуль
администрирования.
Авторизация пользователей
Авторизация пользователей
производится на основе сравнения hash -значения введенного пароля с хранящимся
для данного пользователя в базе данных в момент запуска программы-клиента. При
соединении компьютеров в локальной сети, на компьютере тимлидера появляется
список компьютеров, включенных в сеть и на которых запущена оболочка-клиент,
для сетевого взаимодействия. В последующем, такой компьютер считается
авторизованным, и передача файлов производится уже без дополнительных
авторизаций.
Алгоритм реализации системы
разделения и планирования задач
Система планирования и разделения
задач между разработчиками организована следующим образом: после соединения
всех компьютеров в локальную сеть, один компьютер назначается «ведущим». Им
будет являться компьютер руководителя команды, на котором будет установлена
соответствующая версия программного обеспечения, для простоты именуемая «сервер
планирования задач». После этого, остальные компьютеры в локальной сети
запускают программу, именуемую «клиент планирования задач». В задачи клиента
будет входить следующее:
Прием от сервера планирования задач
собственно задач для каждого конкретного разработчика;
Обеспечение целостности полученных
данных;
Обеспечение возможности работать над
полученными данными, не нарушая общую структуру проекта;
Логическое проектирование
Общая структура и схема работы
разрабатываемой системы
Клиентская и серверная части, с
учетом выполняемых функций, делятся на несколько взаимосвязанных друг с другом
модулей.
На рис. 3.1 изображена схема структуры
логического модуля реализации модуля пересылки файлов.
Рис 3.1. Структура реализации модуля
пересылки файлов.
На рис. 3.2 изображена общая схема
структуры разрабатываемого приложения и схема взаимодействия модулей клиентской
и серверной частей.
Рис.3.2. Структура клиентской и
серверной частей
Структура базы данных
Разрабатываемое приложение нуждается
в базе данных. База данных обеспечит безопасное хранение пар логин-пароль
пользователей, обеспечит возможность хранения списка компьютеров разработчиков
и поставленных им задач, обеспечит ведение лога чата, хранение всех
реализованных проектов и информации о них: трудоемкости, возникших проблемах,
количестве разработчиков. Наиболее полно требованиям системы отвечает
реляционная база данных, поэтому она была выбрана для реализации хранилища
данных приложения.
Для проектирования базы данных
приложения построим инфологическую и логическую модели. Физическая модель будет
реализована в программной части.
Инфологическое проектирование базы
данных
Инфологическая модель ПО
представляет собой описание структуры и динамики ПО, характера информационных
потребностей пользователей системы в терминах, понятных пользователю и
независимых от реализации системы. Более того, инфологическая модель ПО не
должна зависеть от модели данных, которая будет использована при создании БД.
Прежде, чем приступать к созданию
системы автоматизированной обработки информации, необходимо сформировать
понятия о предметах, фактах и событиях, которыми будет оперировать данная
система. Для того чтобы привести эти понятия к той или иной модели данных,
необходимо заменить их информационными представлениями. Одним из наиболее
удобных инструментов унифицированного представления данных, независимого от
реализующего его программного обеспечения, является модель
"сущность-связь" (entity - relationship model, ER - model).
Модель "сущность-связь"
основывается на некой важной семантической информации о реальном мире и
предназначена для логического представления данных. Она определяет значения
данных в контексте их взаимосвязи с другими данными. Важным для нас является
тот факт, что из модели "сущность-связь" могут быть порождены все
существующие модели данных (иерархическая, сетевая, реляционная, объектная),
поэтому она является наиболее общей.
Этот первый этап проектирования
предполагает неформализованное выделение сущностей и их атрибутов. Сущности -
это объекты той предметной области, которая должна быть отражена в БД. Атрибуты
играют роль параметров каждого объекта (сущности).
Для построения инфологической модели
базы данных системы, выделим основные сущности предметной области и связи между
ними.
Сущность ПОЛЬЗОВАТЕЛЬ:пользователя,
Имя входа в систему, Тип пользователя.
Сущность РОЛИ:Роли, Имя
пользователя, роль.
Сущность РАБОЧИЕ РОЛИ:роли, название
роли.
Сущность ПРОЕКТ:, количество файлов,
завершен, дата завершения.
Сущность ТИПЫ ПРОЕКТОВ:Проекта, тип
проекта.
Сущность РАЗДЕЛЕНИЕ РОЛЕЙ:, адрес
компьютер, Роль, Текущий файл.
Сущность УЧЕТВРЕМЕНИ.:, запланированное
время, Затраченное время, оставшееся время, фактическое время выполнения.
Сущность
ЭФФЕКТИВНОСТЬРАЗРАБОТЧИКОВ.:, коэффициент эффективности, точность.
Кроме того, что у каждой сущности
имеются свои атрибуты, между различными сущностями существуют связи. На рис.
3.3 изображена схема, отображающая сущности, их атрибуты и связи.
Рис. 3.3. Графическое представление
модели «сущность-связь»
Логическое проектирование базы
данных
Этап логического проектирования
предполагает преобразование инфологической модели в вид, предписываемый
выбранным типом базы данных. Так как наша база данных является реляционной, то
сущности инфологической модели нужно превратить в отношения (таблицы)
реляционной модели.
Представим каждую сущность в виде
отдельного отношения (таблицы), где каждый атрибут сущности станет полем
(столбцом) таблицы. Но для того, чтобы не пропадала связь между таблицами,
вводятся дополнительные атрибуты внешних ключей, для обеспечения этой связи.
Для каждой таблицы определяются предварительные типы атрибутов и ключевые поля,
которые однозначно определяют каждую бывшую сущность.
Внешний ключ вводится в случае
наличия связи один ко многим для сущности, а теперь уже таблицы.
Для эффективной работы базы данных
требуется, чтобы атрибуты, входящие в состав ключа имели как можно меньший
размер, что увеличивает эффективность функционирования базы данных и устраняет
многие другие проблемы.
Полученные таблицы хоть и
представлены в терминах реляционной базы данных, но обладают свойствами
избыточности и аномалиями при внесении изменений. В соответствии с теорией
реляционных баз данных требуется произвести декомпозицию всех отношений,
входящих в базу данных.
Окончание декомпозиции соответствует
преобразованию таблиц в 4-ю нормальную форму. Она производится последовательным
преобразованием таблиц, начиная с 1-ой до 4-ой нормальной форме.
В результате процедуры нормализации
получили таблицы.
В таблице Users хранятся данные обо
всех пользователях в следующих полях:- идентификатор пользователя;- имя
пользователя;права пользователя- логин пользователя;- hash-значение пароля;
В таблице Roles хранятся типы
пользователей в следующих полях:- идентификатор типа пользователя;- название
типа пользователя.- значения прав, доступных данной роли
В таблице WorkRoles хранятся типы
пользователей в следующих полях:- идентификатор типа разработчика;название типа
разработчика.
В таблице Projects хранятся
запущенные и архивные проекты в следующих полях:- идентификатор
проекта;количество файлов в проекте.определяет, завершен ли проект или нет.-
дата завершения проекта.
В таблице ProjectTypes хранятся типы
проектов на различных языках в следующих полях:- идентификатор языка;-название
языка программирования.
В таблице DivineRoles хранятся
текущие задачи разработчиков по проектам в следующих полях:- идентификатор
задачи;адрес компьютера в сети.тип задачи- текущий файл, над которым ведет
работу программист
В таблице DevelopEffect хранится
информация о эффективности разработчиков в следующих полях:- идентификатор разработчика;коэффициент
эффективности. - точность расчета.
Графический интерфейс
При запуске сервера разработки в
первый раз, руководитель команды увидит следующее окно, которое наглядно
отражено на рис 4.1.
Рис.4.1. Главное окно сервера
разработки.
Это окно состоит из следующих
элементов:
Список компьютеров разработчиков,
находящихся в сети;
Адрес сервера разработки, по
которому его будут находить все клиентские компьютеры;
Кнопка отчеты, предоставляющая доступ
к интерфейсу управления отчетами;
Кнопка планирование, предоставляющая
доступ к интерфейсу планирования задач и управления временем;
Кнопка дополнительно,
предоставляющая доступ к дополнительным функциям, например оценке эффективности
разработчиков;
Кнопка открыть окно ролей позволяет
просмотреть существующих пользователей и добавить новых;
Кнопка выбрать тип проекта позволяет
выбрать тип проекта(язык программирования, на котором будет разрабатываться
проект);
Кнопка Invoke позволяет указать путь
к файлу проекта и запустить разделение файлов по программистам и начать
разработку проекта.
Кнопки Transfer и Save предназначены
для отправки задач и приема готовых файлов.
Интерфейс текущих проектов содержит
список всех проектов, который содержит номер проекта, количество файлов в нем,
статус проекта и дату завершения. Он представлен на рисунке 4.2.
Рис.4.2. Список текущих проектов.
Описание классов
В программе используются следующие
классы:.cs - выполняет загрузку из базы данных, алгоритмы разделения задач меду
разработчиками, главное окно программы сервера;.cs - служит для создания задач,
добавления новых пользователей в базу данных и управления ими;- служит для
автоматического разделения задач между разработчиками, оценки эффективности
каждого разработчика, учета времени выполнения задач, списка проблем,
обнаруженных в процессе разработки, генерации отчетов. .cs - предоставляет
интерфейс работы с базой данных. Используется технология LINQ to SQL,
позволяющая с легкостью оперировать получением и передачей значений в базу
данных, представляя таблицы в виде классов. .cs - представляет собой интерфейс
межсетевого взаимодействия и обнаружения компьютеров в сети через сокеты.
Использует системные вызовы WinApi. .cs - представляет список доступных
проектов и связанных с ними файлов..cs - предоставляет операции со списком
проектов. .xsd - представляет таблицы из базы даных в виде набора данных.
Технологический раздел
Руководство пользователя
Для использования системы заполнить базу
данных в соответствии с заданными таблицами.
Для запуска приложения необходимо
выполнить файл NetListSample.exe.
Руководство системного
администратора
Для корректной работы программы
необходимо наличие правильно заполненной базы данных.
Дополнительных настроек программного
обеспечения не требуется.
Руководство программиста
Программа написана на языке C# с
применением сервера базы данных Microsoft SQL Server.. Используемая среда
разработки - Visual Studio 2013.
Библиографический список
ЕСКД.
Справочное пособие. С.С.Ворушек, А.А.Волков, М.М.Ефимова. и др. - М.: Изд-во
Стандартов, 1989. - 362 с.
ЕСКД.
ГОСТ 15.001-88, техническое задание
ЕСПД.
Сборник стандартов, - М.: Изд-во Стандартов, 1988. -128 с.
ЕСС
АСУ. Сборник стандартов.- М.: Изд-во Стандартов, 1988.-120 с.
Приложение. Листинг программы
AddUser.csSystem;
using
System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Data.Sql;System.Data.Linq;System.Data.Linq.Mapping;System.Runtime.Remoting;System.Text;System.Threading.Tasks;System.Windows.Forms;NetListSample
{partial class AddUser : Form
{AddUser()
{();();
}db =DataContext(@"Data Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");
private void InitializeListBox()
{sb = new StringBuilder();
sb.Append("Роль \t \t \t Права
доступа");
listBox1.Items.Add(sb);
/*DataContext db
=DataContext(@"Data Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");*/<Role> roles =
db.GetTable<Role>();<Role> rolesValue =role in rolesrole;
foreach (var id in rolesValue)
{
//listBox1.Items.Add(id.RoleName);hleb
= new StringBuilder().Append(id.RoleName.Trim()+"\t
\t").Append(id.RoleAttributes.Trim());.Items.Add(hleb);
//sb.Clear();
}
}void button1_Click(object sender,
EventArgs e)
{userName =
Convert.ToString(txtUserName.Text);roleId =
listBox1.SelectedIndex;.ExecuteCommand("INSERT INTO wp.dbo.Users
VALUES('" + userName + "'," + roleId + ")");
}
}
}.csSystem;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;NetListSample
{System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Text;System.Windows.Forms;System.Runtime.InteropServices;System.Collections;PortTest
{class ComputersInLocalNetwork
{
[DllImport("netapi32.dll",
EntryPoint = "NetServerEnum")]static extern NERR NetServerEnum(
[MarshalAs(UnmanagedType.LPWStr)]string
ServerName,Level, out IntPtr BufPtr,PrefMaxLen, ref int EntriesRead,int
TotalEntries, SV_101_TYPES ServerType,
[MarshalAs(UnmanagedType.LPWStr)]
string Domain,ResumeHandle);
[DllImport("netapi32.dll",
EntryPoint = "NetApiBufferFree")]static extern NERR
NetApiBufferFree(IntPtr Buffer);
[StructLayout(LayoutKind.Sequential)]struct
SERVER_INFO_101
{
[MarshalAs(UnmanagedType.U4)]uint
sv101_platform_id;
[MarshalAs(UnmanagedType.LPWStr)]string
sv101_name;
[MarshalAs(UnmanagedType.U4)]uint
sv101_version_major;
[MarshalAs(UnmanagedType.U4)]uint
sv101_version_minor;
[MarshalAs(UnmanagedType.U4)]uint
sv101_type;
[MarshalAs(UnmanagedType.LPWStr)]string
sv101_comment;
}
/// <summary>
/// список
ошибок,
возвращаемых
NetServerEnum
/// </summary>enum NERR
{_Success = 0, // успех_ACCESS_DENIED
= 5,_NOT_ENOUGH_MEMORY = 8,_BAD_NETPATH = 53,_NETWORK_BUSY =
54,_INVALID_PARAMETER = 87,_INVALID_LEVEL = 124,_MORE_DATA = 234,_EXTENDED_ERROR
= 1208,_NO_NETWORK = 1222,_INVALID_HANDLE_STATE =
1609,_NO_BROWSER_SERVERS_FOUND = 6118,
}
/// <summary>
/// Типы
серверов
/// </summary>
[Flags]enum SV_101_TYPES : uint
{_TYPE_WORKSTATION =
0x00000001,_TYPE_SERVER = 0x00000002,_TYPE_SQLSERVER =
0x00000004,_TYPE_DOMAIN_CTRL = 0x00000008,_TYPE_DOMAIN_BAKCTRL =
0x00000010,_TYPE_TIME_SOURCE = 0x00000020,_TYPE_AFP = 0x00000040,_TYPE_NOVELL =
0x00000080,_TYPE_DOMAIN_MEMBER = 0x00000100,_TYPE_PRINTQ_SERVER =
0x00000200,_TYPE_DIALIN_SERVER = 0x00000400,_TYPE_XENIX_SERVER =
0x00000800,_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,_TYPE_NT =
0x00001000,_TYPE_WFW = 0x00002000,_TYPE_SERVER_MFPN =
0x00004000,_TYPE_SERVER_NT = 0x00008000,_TYPE_POTENTIAL_BROWSER =
0x00010000,_TYPE_BACKUP_BROWSER = 0x00020000,_TYPE_MASTER_BROWSER =
0x00040000,_TYPE_DOMAIN_MASTER = 0x00080000,_TYPE_SERVER_OSF =
0x00100000,_TYPE_SERVER_VMS = 0x00200000,_TYPE_WINDOWS = 0x00400000,_TYPE_DFS =
0x00800000,_TYPE_CLUSTER_NT = 0x01000000,_TYPE_TERMINALSERVER =
0x02000000,_TYPE_CLUSTER_VS_NT = 0x04000000,_TYPE_DCE =
0x10000000,_TYPE_ALTERNATE_XPORT = 0x20000000,_TYPE_LOCAL_LIST_ONLY =
0x40000000,_TYPE_DOMAIN_ENUM = 0x80000000,
SV_TYPE_ALL = 0xFFFFFFFF,
}
// получим список всех компьюетеров
public static List<string>
GetServerList(SV_101_TYPES type)
{_INFO_101 si;pInfo =
IntPtr.Zero;etriesread = 0;totalentries = 0;<string> srvs = new
List<string>();
{err = NetServerEnum(null, 101, out
pInfo, -1, ref etriesread, ref totalentries, SV_101_TYPES.SV_TYPE_ALL, null,
0);((err == NERR.NERR_Success || err == NERR.ERROR_MORE_DATA) && pInfo
!= IntPtr.Zero)
{ptr = pInfo.ToInt32();(int i = 0; i
< etriesread; i++)
{=
(SERVER_INFO_101)Marshal.PtrToStructure(new IntPtr(ptr),
typeof(SERVER_INFO_101));.Add(si.sv101_name.ToString()); // добавляем
имя
сервера
в
список
ptr += Marshal.SizeOf(si);
}
}
}(Exception) { /* обработка
ошибки
нифига
не
делаем
:(*/ }
finally
{ // освобождаем выделенную память(pInfo != IntPtr.Zero)
NetApiBufferFree(pInfo);
}(srvs);
}
}
}
}.csSystem;System.Collections.Generic;System.Data.Linq;System.Data.Linq.Mapping;System.Linq;System.Security.AccessControl;System.Text;System.Threading.Tasks;NetListSample
{
[Table(Name =
"projectTypes")]projectTypes
{
/*private int _id;
[Column(IsPrimaryKey = true, Storage
= "_id")]int ID
{{ return this._id; }{ this._id =
value; }
}*/string _projectType;
[Column(IsPrimaryKey = false,
Storage = "_projectType")]string ProjectType
}
}
[Table(Name =
"Users")]Users
{int _id;
[Column(IsPrimaryKey = true, Storage
="_id")]int ID
{{ return this._id; }{ this._id =
value; }
}string _name;
[Column(IsPrimaryKey = false,
Storage = "_name")]string Name
{{ return this._name; }{ this._name
= value; }
}int _role;
[Column(IsPrimaryKey = false,
Storage = "_role")]int Role
{{ return this._role; }{ this._role
= value; }
}
}
[Table(Name =
"Projects")]Projects
{int _id;
[Column(IsPrimaryKey = true, Storage
= "_id")]int ID
{{ return _id; }{ this._id = value;
}
}int _countOfFiles;
[Column(IsPrimaryKey = true, Storage
= "_countOfFiles")]int CountOfFiles
{{ return _countOfFiles; }{
this._countOfFiles = value; }
}int _completed;
[Column(IsPrimaryKey = true, Storage
= "_completed")]int Completed
{{ return _completed; }{
this._completed = value; }
}DateTime _dateCompleted;
[Column(IsPrimaryKey = true, Storage
= "_dateCompleted")]DateTime DateCompleted
{{ return _dateCompleted; }{
this._dateCompleted = value; }
}
}
[Table(Name =
"WorkRoles")]workRoles
{int _id;
[Column(IsPrimaryKey = true, Storage
= "_id")]int ID
{{ return this._id; }{ this._id =
value; }
}string _workType;
[Column(IsPrimaryKey = false,
Storage = "_workType")]string WorkType
{{ return this._workType; }{
this._workType = value; }
}
}
[Table(Name =
"Roles")]Role
{int _id;
[Column(IsPrimaryKey = true, Storage
= "_id")]int ID
{{ return this._id; }{ this._id =
value; }
}string _RoleName;
[Column(IsPrimaryKey = true, Storage
= "_RoleName")]string RoleName
{{ return this._RoleName; }{
this._RoleName = value; }
}string _RoleAttributes;
[Column(IsPrimaryKey = true, Storage
= "_RoleAttributes")]string RoleAttributes
{{ return this._RoleAttributes; }{
this._RoleAttributes = value; }
}
}
}.csSystem;System.Collections.Generic;System.Data.Linq;System.IO;System.Linq;System.Text;System.Threading.Tasks;NetListSample
{class DivineTasks
{List<string> computers = new
List<string>();List<string> fileList = new
List<string>();List<string> roles = new List<string>();
void AddComp(string computerIp)
{.computers.Add(computerIp);
}void AddFile(string filePath)
{.fileList.Add(filePath);
}void AddRole(string role)
{.roles.Add(role);
}void TransactDb()
{db =DataContext(@"Data Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");i = 0;r = new Random();(var file in
fileList)
{role = roles[r.Next(0, roles.Count
- 1)];
/*var computer =
computers[0];.Remove(computer);*/computer = computers[i];(i != computers.Count
- 1) i++;
{= 0;
}command = new
StringBuilder();.Append("INSERT INTO wp.dbo.DivineRoles VALUES('");.Append(computer.Trim());.Append("','");.Append(role.Trim());.Append("','");.Append(file);.Append("')");.ExecuteCommand(command.ToString());
//db.ExecuteCommand("INSERT
INTO wp.dbo.DivineRoles VALUES('" + computer + @"','" + role +
@"','" + curFile +
// @"')");
}
}
}
}.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Data.Linq;System.Drawing;System.IO;System.Linq;System.Data.Linq.Mapping;System.Net;System.Net.Sockets;System.Text;System.Threading.Tasks;System.Windows.Forms;NetListSample.PortTest;NetListSample
{partial class FilesList : Form
{delegate void
MyButtonClickedHandler(DivineTasks tasks);event MyButtonClickedHandler
MyButtonClicked;divineTasks = new DivineTasks();db =DataContext(@"Data
Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");
FilesList(List<string>
fileList)
{();
//Find All Computers in local
networka =
PortTest.ComputersInLocalNetwork.GetServerList(ComputersInLocalNetwork.SV_101_TYPES.SV_TYPE_ALL);<IPHostEntry>
ipList = new List<IPHostEntry>();(var comp in a)
{.Add(Dns.GetHostByName(comp));.Items.Add(Dns.GetHostByName(comp).AddressList[0]);
//Add computer
IP.AddComp(Dns.GetHostByName(comp).AddressList[0].ToString());
}(var file in fileList)
{
listBox1.Items.Add(Path.GetFileName(file));.AddFile(file);
}workRoles =
db.GetTable<workRoles>();<workRoles> workRolesList =workrole in
workRolesworkrole;(var role in workRolesList)
{.Items.Add(role.WorkType);.AddRole(role.WorkType.ToString());
}
//write transaction in
db.TransactDb();
}void FilesList_Load(object sender,
EventArgs e)
{
}void button1_Click(object sender,
EventArgs e)
{(MyButtonClicked != null)
{(divineTasks);
}fullname =
@"D:\\ReverseElement.html";ip = "127.0.0.1";
}
}
//not used nowclass FileList
{static List<string>
_filesList = new List<string>();static void Add(string item)
{
_filesList.Add(item);
}static List<string> Get()
{_filesList;
}
}
}.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Data.Linq;System.Drawing;System.Linq;System.Net;System.Net.Sockets;System.Text;System.Threading.Tasks;System.Windows.Forms;NetListSample.PortTest;System.IO;System.Net;System.Threading;System.Net.Sockets;Microsoft.VisualBasic;NetListSample
{partial class btnPlanned : Form
{string fname;string fullname;
//public string
fileExtension;TcpListener listener1 = new TcpListener(IPAddress.Any, 27020);
TcpListener listener2 = new TcpListener(IPAddress.Any,
27021);System.Threading.Thread serverThread;
//private System.Threading.Thread
reciveTimeThread;string data1;btnPlanned()
{+=
Form1_Load;.InitializeComponent();.Threading.Thread messegeThread = new
System.Threading.Thread(messege);.Threading.Thread reciveTimeThread = new
System.Threading.Thread(reciveTime);.IsBackground = true;.Start();.IsBackground
= true;.Start();
}void button1_Click(System.Object
sender, System.EventArgs e)
{
//Проверка размера файла, если < 45 мб, то
все ок
OpenFileDialog OFD = new
OpenFileDialog { Title = "Выберите
файл"
};(OFD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{.IO.FileInfo file = new
System.IO.FileInfo(OFD.FileName);(file.Length > 50000000)
{.Show("Размер
файла
слишком
велик!");
}
{= OFD.FileName;
//Путь
к
отправляемому
файлуa
=
PortTest.ComputersInLocalNetwork.GetServerList(ComputersInLocalNetwork.SV_101_TYPES.SV_TYPE_ALL);<IPHostEntry>
ipList = new List<IPHostEntry>();(var comp in a)
{.Add(Dns.GetHostByName(comp));.Items.Add(Dns.GetHostByName(comp).AddressList[0]);
}dirList =
Directory.GetFiles(@"C:\webbrowsersample");();
/*string sHostName =
Dns.GetHostName();ipHost = Dns.GetHostByName(sHostName);*/
//Запуск
процедуры
отправки
файла
}
}
}
public
void client()
{
//Вырезаем из полного пути к файлу только его
имя и расширение
string Splitingres = null;[] str1 =
null;= fullname.Split('\\');
//Splitingres = str1.Length;=
str1[1];
// Передаем имя файла в переменную fname
Socket send = new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] bytes = new byte[1025];
//ну создаем сокет, байты, получаем ip из
текствокса
System.Net.IPAddress ip = System.Net.IPAddress.Parse(textBox1.Text);remoteEP
= new IPEndPoint(ip, 27015);
//Получаем
конечную
точку
ip/port.Connect(remoteEP);
//конектимся[]
message = Encoding.UTF8.GetBytes(fname);
//Преводим в байты короткое имя файла
int bytesSent = send.Send(message);
// Посылаем
егоclient
= new TcpClient(ip.ToString(), 27020);
//Создаем ТСР клиент на другом порту
NetworkStream Stream =
client.GetStream();writer = new BinaryWriter(Stream);[] fileData = new
Byte[1024];= File.ReadAllBytes(fullname);
//Ну там выше все понятно,
//тут читаем все байты из отправляемого файла и
помещаем в переменную fileData
writer.Write(fileData.Length);.Write(fileData);
// Пишем в соединение BinaryWriter ом все байты.
writer.Close();.Shutdown(SocketShutdown.Both);.Close();
}void messege()
{
// Тут мы все слухаем, пока не придет имя файла
byte[] bytes = new
Byte[1025];listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);remoteEP = new IPEndPoint(IPAddress.Any,
27015);.Bind(remoteEP);.Listen(10);(true)
{handler = listener.Accept();=
null;(true)
{
//Получаем
имя
файла
в
data1= new byte[1025];bytesRec = handler.Receive(bytes);+=
Encoding.UTF8.GetString(bytes, 0, bytesRec);= new
TcpListener(IPAddress.Any,27020);
listener1.Start();
//Создаем и запускаем TcpListener для принятия
файла
//Выводим сообщение в метку, напрямую
нельзя,(label1.InvokeRequired)
{
//Т.к. мы в другом потоке, поэтому обращаемся к
ней через Invoke
//listener1.Stop().Invoke(new
System.Threading.ThreadStart(lab));
}
{();
}; // TODO: might not be correct.
Was : Exit While
}.Shutdown(SocketShutdown.Both);.Close();
}
}void reciveTime()
{
// Тут мы все слухаем, пока не придет имя файла
byte[] bytes = new
Byte[1025];listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);remoteEP = new IPEndPoint(IPAddress.Any,
27016);.Bind(remoteEP);.Listen(10);(true)
{handler = listener.Accept();=
null;(true)
{
//Получаем
имя
файла
в
data1= new byte[1025];bytesRec = handler.Receive(bytes);+=
Encoding.UTF8.GetString(bytes, 0, bytesRec);((Convert.ToInt32(data1)));= new
TcpListener(IPAddress.Any, 27021);
listener2.Start();
//Создаем и запускаем TcpListener для принятия
файла
//Выводим сообщение в метку, напрямую
нельзя,(label5.InvokeRequired)
{
//Т.к. мы в другом потоке, поэтому обращаемся к
ней через Invoke
//listener1.Stop().Invoke(new
System.Threading.ThreadStart(lab));
}
{();
}; // TODO: might not be correct.
Was : Exit While
}.Shutdown(SocketShutdown.Both);.Close();
}
}
void SetTime(int time)
{r = new Random();db =DataContext(@"Data
Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");.ExecuteCommand("INSERT INTO
dbo.TimeManagment VALUES(1,'" + DateTime.Now + "',200," + time +
"," +.Next(200, 700) + ")");.Connection.Close();.Stop();
}void lab()
{.Text = "Бери пака дают!";
}void Form1_Load(System.Object
sender, System.EventArgs e)
{
}void button2_Click(System.Object
sender, System.EventArgs e)
{
//По нажатию кнопки получаем имя файла из
переменной data1
//Разрезаем его на имя и расширение
string[] spl = null;=
data1.Split('.');
//Dim SFD As New SaveFileDialog With
{.Filter = "Файлы
(*." & spl(1) & ")|*." & spl(1)
& "", .Title = "Куда сохранить файл?"}
SaveFileDialog SFD = new
SaveFileDialog {= "Файлы
(*." + spl[0] + ")|*." + spl[1] +
"",= "Куда сохранить файл?"
};
//Ну это сейффайлдиалог.FileName = spl[0];
//Имя
файла(SFD.ShowDialog()
== System.Windows.Forms.DialogResult.OK) {client =
listener1.AcceptTcpClient();Stream = client.GetStream();reader = new
BinaryReader(Stream);
// Там все то же только тут BinaryReader для
чтения байтов из потока
int fileLength =
reader.ReadInt32();[] fileData = new Byte[1024];=
reader.ReadBytes(fileLength);.WriteAllBytes(SFD.FileName, fileData);
//Пишем
байт
в
файл
.Stop();
// Останавливаем листнер= null;.Text =
"Передача файла завершена";
/* handle exeption with new socket
on old port */.Stop();
}
}void button3_Click(object sender,
EventArgs e)
{addUserForm=new AddUser();.Show();
}taskList = new
DivineTasks();flistForm_MyButtonClicked(DivineTasks tasks)
{= tasks;
}void button4_Click(object sender,
EventArgs e)
{
//uncomment for release
//FolderBrowserDialog fdDialog = new
FolderBrowserDialog();
//fdDialog.ShowDialog();
//string dirPath =
fdDialog.SelectedPath;dirPath = @"C:\Users\Пользователь\Documents\Visual
Studio 2013\Projects\BzCurs\BzCurs";.Text = dirPath;
//catch error if no directory select
in dialog
//debug.Uncomment for release
//DirectoryInfo dr = new
DirectoryInfo(dirPath);
//DirectoryInfo dr = new
DirectoryInfo(@"C:\Users\Пользователь\Documents\Visual
Studio 2013\Projects\BzCurs\BzCurs");<string> fileList = new
List<string>();(var file in
Directory.GetFiles(dirPath,ProjectTypes.FileExtension.Extension,SearchOption.AllDirectories))
{.Add(file);
}
//var soloma =
dr.GetFiles();flistForm = new FilesList(fileList);.MyButtonClicked += new
FilesList.MyButtonClickedHandler(flistForm_MyButtonClicked);.Show();
}void button5_Click(object sender,
EventArgs e)
{ptTypes = new
ProjectTypes();.Show();
}void SaveFile(string filename)
{
//Имя
файлаFilePath
= @"D:\\kolos\"+filename;client = listener1.AcceptTcpClient();Stream
= client.GetStream();reader = new BinaryReader(Stream);
// Там все то же только тут BinaryReader для
чтения байтов из потока
int fileLength =
reader.ReadInt32();[] fileData = new Byte[1024];= reader.ReadBytes(fileLength);.WriteAllBytes(FilePath,
fileData);
//Пишем
байт
в
файл
//listener1.Stop();
// Останавливаем листнер= null;.Text =
"Передача файла завершена";
/* handle exeption with new socket
on old port */
//listener1.Stop();
}void button9_Click(object sender,
EventArgs e)
{(var task in taskList)
{.Items.Add(task);= (string)task;
//string[] spl = null;
//spl =
fullname.Split('.');();(Path.GetFileName(fullname));
}
}void button8_Click(object sender,
EventArgs e)
{cp = new CurProjects();.Show();
}
}
}.csSystem;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;NetListSample
{ProjectsEnumProvider
{int _id;string _title;
//Pattern - filetype;string
_fileType;Dictionary<string, string> dictionary = new Dictionary<string,
string>();void InitDict()
{.Add("C#","*.cs");.Add("C++",
"*.cpp");.Add("VB.NET",
"*.vb");.Add("Haskell",
"*.hx");.Add("Erlang",
"*.erl");.Add("Prolog", "*.pro");
}
/*public enum hyesos
{,cpp,vb,hx,erl,pro
}*/string FileType
{{ return _fileType; }{ _fileType =
value; }
}
}
}.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Data.Linq;System.Drawing;System.Linq;System.Text;System.Threading.Tasks;System.Windows.Forms;NetListSample;NetListSample
{partial class ProjectTypes : Form
{static class FileExtension
{
/* Warning, may be errors if
Extension ="" */ static string Extension="";
}ProjectTypes()
{();();
}void InitList()
{db =DataContext(@"Data Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");<projectTypes> project =
db.GetTable<projectTypes>();<projectTypes> ptyQueryable
=projectTypese in projectprojectTypese;(var curLanguage in ptyQueryable)
{.Items.Add(curLanguage.ProjectType);
}
}void button1_Click(object sender,
EventArgs e)
{pr = new ProjectsEnumProvider();
//Init dictionary with pairs -
project type -> fileType (rashirenie). Эти ебаные
комментарии, которые я сам потомне пойму.InitDict();
pr.FileType =
comboBox1.SelectedItem.ToString();.Extension = pr.dictionary[pr.FileType];
}
}
}.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Data.Linq;System.Drawing;System.Linq;System.Text;System.Threading.Tasks;System.Windows.Forms;NetListSample
{partial class CurProjects : Form
{CurProjects()
{();
}void CurProjects_Load(object
sender, EventArgs e)
{db =DataContext(@"Data Source=ПОЛЬЗОВАТЕЛЬ-ПК\Curs;Initial
Catalog=wp;Integrated Security=True");projects =
db.GetTable<Projects>();<Projects> projectsList =project in
projectsproject;(var project in projectsList)
{.Items.Add(project.ID);.Items.Add(project.CountOfFiles);(project.Completed
== 1)
{.Items.Add("Да");
}
{
{.Items.Add("Нет");
}
}.Items.Add(project.DateCompleted);
}
}
}
}.csSystem;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.IO;System.Linq;System.Net;System.Net.Sockets;System.Text;System.Windows.Forms;NetListClient
{partial class Form1 : Form
{Form1()
{();
}void button1_Click(object sender,
EventArgs e)
{
}void button2_Click(object sender,
EventArgs e)
{send = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
byte[] bytes = new byte[1025];
//ну создаем сокет, байты, получаем ip из
текствокса
System.Net.IPAddress ip =
System.Net.IPAddress.Parse(textBox2.Text);remoteEP = new IPEndPoint(ip, 27016);
//Получаем
конечную
точку
ip/port.Connect(remoteEP);
//конектимся[]
message = Encoding.UTF8.GetBytes(textBox1.Text);
//Преводим в байты короткое имя файла
int bytesSent = send.Send(message);
// Посылаем
егоclient
= new TcpClient(ip.ToString(), 27021);
//Создаем ТСР клиент на другом порту
NetworkStream Stream =
client.GetStream();writer = new BinaryWriter(Stream);[] fileData = new
Byte[1024];
//fileData =
File.ReadAllBytes(fullname);
//Ну там выше все понятно,
//тут читаем все байты из отправляемого файла и
помещаем в переменную fileData
writer.Write(textBox1.Text.Length);.Write(textBox1.Text);
// Пишем
в
соединение
BinaryWriter ом все
байты..Close();.Shutdown(SocketShutdown.Both);.Close();
}void button3_Click(object sender,
EventArgs e)
{
}
}
}