1 Основные функции сервера Приложение-сервер представляет собой консольную программу. При запуске сервера можно указать порт для прослушивания входящих подключений. Сервер работает в многопоточном режиме. Каждый поток выполняет свою задачу: 1. Основной поток постоянно слушает входящие подключения на указанном порту. Если клиент пытается подключиться, сервер автоматически принимает его подключение и запускает (отдельный для каждого клиента) поток общения с ним. При этом сервер выводит в консоль информацию о подключенном клиенте (его IP адрес). 2. Поток чтения данных читает с видеоустройства кадры. 3. Поток общения между клиентом и сервером получая команду от клиента «getnextframe» получает данные у потока чтения кадров и передает клиенту данные текущего кадра по сети. При старте данный поток оповещает о том, что начал передавать данные клиенту выводя соответствующее сообщение в консоль. Потоки синхронизированы, таким образом исключается возможность отправки некорректных данных видеокадра конечным клиентам. Сервер обрабатывает следующие исключительные ситуации: 1. Камера не подключена или отключилась в процессе работы. В данной исключительной ситуации приложение-сервер выводит сообщение о данной ошибке в консоль и разрывает все активные соединения с клиентами. 2. Клиент не отвечает. При наступлении данной исключительной ситуации сервер корректно завершает поток общения с клиентом и закрывает установленное между ним и клиентом соединение и, естественно, оповещает о данном событии выводя в консоль сообщение о разрыве соединения. 2 Основные функции клиента Приложение-клиент представляет оконную программу. При запуске клиента отображается главное окно. Для установления соединения с сервером предлагается заполнить следующие данные: 1. IP адрес сервера 2. Номер порта Номер порта заполнен по-умолчанию и соответствует значению номера порта по-умолчанию в серверном приложении. При нажатии на кнопку “Start Video Stream” клиент посылает исходящий сигнал на сервер и ждет пока сервер приймет его подключение. В случае успешного соединения открывается окно для показа видеоданных и запускается отдельный поток общения между клиентом и сервером. Поток общения с определенным промежутком времени посылает серверу команду «getnextframe», после чего читает ответ в котором содержатся данные текущего видеокадра на сервере. В любой момент времени можно остановить поток общения (видео поток), нажав кнопку “Stop Video Stream”. Все потоки приложения-клиента синхронизированы, что обеспечивает корректное завершение подключений при закрытии программы. Приложение-клиент обрабатывает корректно обрабатывает следующие исключительные ситуации: 1. Невозможно подключиться к серверу. Если по указанным параметрам сервера подключения не принимаются определенное время, то клиент выдает сообщение об ошибке «Не могу подключиться к серверу». 2. Сервер не отвечает. Если определенное время сервер не присылает данные в потоке общения между клиентом и сервером, то данный поток корректно закрывает установленное соединение, закрывает окно показа видео и завершается 3 Особенности взаимодействия между сервером и клиентами При взаимодействии между клиентами и сервером используются следующие протоколы: На канальном уровне модели OSI используется драйвер устройства и интерфейсная плата. На сетевом уровне модели OSI используется протокол IP. На транспортном уровне ипользуется протокол UDP. Так как объемы данных передаваемые сервером конечным клиентам довольно велики и опасность потерять определенную информацию не критична (в одну секунду сервер отсылает каждому клиенту 24 видеокадра), то данный протокол использовать выгоднее нежели TCP. На прикладном уровне модели OSI используется разработанный автором протокол для передачи видеокадров, описанный в следующем подразделе. 4 Протокол передачи видеокадров по сети В данном протоколе различается только один вид запроса: получение текущего кадра видео. Для осушествления данного запроса клиент посылает серверу сообщение «getnextframe». В ответ на данный тип запроса сервер присылает клиенту ответ с следующем формате: width;height;countChannels;colorDepth;frameData Где: width – целое число, ширина видеокадра в пикселах height – целое число, высота видеокадра в пикселах countChannels – количество цветовых плоскостей видеокадра colorDepth – глубина цвета каждого пиксела видеокадра frameData – массив байт изображения снятый построчно с матрицы видеокадра.