Для осуществления передачи данных между клиентом и сервером используется протокол, основанный на транспортном протоколе TCP, передача аудиоданных между клиентами осуществляется по протоколу, использующему в качестве основы дейтаграммный протокол UDP.
Взаимодействие клиента с сервером
Взаимодействие клиента с сервером требует высокой степени надежности, поэтому необходима гарантированная доставка сообщений. Для этого использовался протокол, основанный на протоколе TCP. Рассмотрим его основные аспекты.
При подключении клиента устанавливается соединение с сервером. Сервер, получая запрос на соединение, выделяет поток для взаимодействия с пользователем и отправляет ему подтверждение.
После этого клиент отправляет серверу сообщение AuthorizationRequest, которое сопровождает имя и пароль пользователя, пытающегося подключиться к серверу. Сервер анализирует полученные данные — проверяет есть ли пользователь с таким именем в сети и правильность пароля сервера, и отправляет клиенту сообщение AuthorizationSuccess или AuthorizationFailed в зависимости от результата проверки вместе с информацией о подключенных пользователях, а остальным клиентам сообщение об авторизации нового пользователя с его именем.
Таким образом, каждый клиент имеет информацию обо всех активных пользователях и в случае необходимости сможет организовать передачу данных с другим клиентом.
При необходимости прекратить взаимодействие клиент отправляет серверу сообщение IQuit. Сервер, получив это сообщение, удаляет всю информацию о пользователе и оповещает всех клиентов об отключении данного пользователя.
Схема взаимодействия представлена на рисунке 2.3.
Рисунок 2.3. Схема взаимодействия между клиентом и сервером
Взаимодействие между клиентами
Взаимодействие между клиентами осуществляется как по протоколу TCP, так и по протоколу UDP.
По протоколу TCP осуществляется передача запроса на передачу медиаданных, подтверждение или отказ от инициирования передачи, а также уведомления об отключении пользователя от процесса аудиопередачи.
По протоколу UDP производится непосредственно передача аудиоданных.
При инициировании запроса на передачу данных Клиент1 отправляет сообщение ConnectToClient Клиенту2, с которым он хочет соединиться.
Клиент2, получив сообщение, соглашается или отказывается от соединения и отправляет сообщение ConnectToClientSuccess или ConnectToClientFailed соответственно. Если соединение установлено, то начинается передача аудиоданных по протоколу UDP.
Если Клиент1 хочет прекратить передачу данных — он отправляет Клиенту2 сообщение DisconnectRequest, после чего оба клиента прекращают передачу медиаданных.
Схема взаимодействия между клиентами представлена на рисунке 2.4.
Рисунок 2.4. Схема взаимодействия между клиентами