- PVSM.RU - https://www.pvsm.ru -

Java: IP-телефония с нуля

В предыдущей статье «Транслируем звук по сети с помощью Java» [1] я описывал способ приема и трансляции звука по сети встроенными средствами Java.

Здесь я продолжу развивать эту идею, и расскажу, как сделать с помощью Java простую систему IP-телефонии.

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

Полностью исходники можно посмотреть на github [2].

Всех заинтересовавшихся прошу под кат.

NetworkingAudioServer — серверная часть системы

Серверная часть работает на базе сервлетов, Apache Tomcat и MySQL.

Структура базы данных

База данных состоит из двух таблиц: users — хранит учетные данные пользователей и userinfo — сопоставляет каждому пользователю IP и время его последнего обновления.

CREATE TABLE IF NOT EXISTS `users` (
    `email` varchar(100) NOT NULL PRIMARY KEY, 
    `password` varchar(100) NOT NULL, 
    `confirm` varchar(100) NOT NULL,
    `user_id` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Названия email и password говорят сами за себя, confirm — токен подтверждения почтового адреса либо 'done', если e-mail подтвержден, user_id — md5-хэш от адреса электронной почты (так как он имеет фиксированную длину, его удобно использовать для идентификации входящего звонка).

CREATE TABLE IF NOT EXISTS `userinfo` (
    `email` varchar(100) NOT NULL PRIMARY KEY, 
    `user_id` varchar(100) NOT NULL, 
    `ip` varchar(100) NOT NULL, 
    `last_update` TIMESTAMP NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Поля email и user_id соответствуют полям из предыдущей таблицы, что такое ip понятно из названия, last_update — время последнего обновления IP.

Сервлеты

RegisterServlet [3] регистрирует пользователя в базе данных и высылает на электронную почту запрос на подтверждение с помощью следующего скрипта:

#!/bin/sh
email=$1
confirm=$2
SERVER_URL="http://tabatsky.ru/networkingaudio";
TMP_FILE="/common_scripts/tmp/$confirm";

echo "To: $email" > $TMP_FILE;
echo "From: service@tabatsky.ru" >> $TMP_FILE;
echo "Subject: Networking Audio e-mail confirmation" >> $TMP_FILE;
echo >> $TMP_FILE;
echo "$SERVER_URL/confirm?confirm=$confirm" >> $TMP_FILE;
echo >> $TMP_FILE;

sendmail $email < $TMP_FILE

ConfirmServlet [4] — выполняет подтверждение e-mail.

UpdateIPServlet [5] — обновляет IP клиента при запросе, IP определяется автоматически.

GetUserInfoServlet [6] — в качестве параметра принимает email или user_id, при запросе возвращает email или user_id и текущий IP, либо значение 'offline', если IP не обновлялся более трех минут.

Настройка серверной части

Для установки серверной части нужно:

  • Создать базу данных MySQL
  • Указать правильные значения логина, пароля и базы данных MySQL в классе MyDBConnect [7]
  • Собрать и задеплоить на Tomcat
  • Указать правильное значение SERVER_URL в скрипте отправки почты, сам скрипт разместить по адресу /common_scripts/sendConfirm и установить права на выполнение
  • Создать папку /common_scripts/tmp и установить права на запись

jNetworkingAudioClient — консольный клиент

Структура клиента

Консольный клиент состоит из четырех классов с программной логикой — Main [8], Master [9], Slave [10] и IPUpdater [11], и двух вспомогательных классов — Util [12] и DeclinedException [13].

Класс Util хранит настройки клиента — такие как параметры звука и объем буфера.

Класс Main отвечает за программную логику интерфейса.

Класс IPUpdater каждые 90 секунд отправляет сервлету запрос на обновление IP.

Класс Master слушает сетевой порт и, в свою очередь, содержит в себе два вложенных класса-потока: MicrophoneReader — читает данные с микрофона и Sender — отправляет данные второму абоненту.

Класс Slave: инициирует соединение, отправляя второму абоненту md5-хэш адреса электронной почты, затем, если звонок принят, начинает читать данные из сокета и отправлять их на аудио-выход.

Более подробно описывать устройство клиента, пожалуй, не стану — все желающие могут сами ознакомиться с исходным кодом.

Запуск клиента

Здесь [14] можно взять готовый исполняемый jar.

Запуск:

java -jar jNetworkingAudioClient.jar http://serverUrl 2>log.txt

Желающие могут попробовать на моем сервере:

java -jar jNetworkingAudioClient.jar http://tabatsky.ru/networkingaudio/ 2>log.txt

Но: в целях хабраэффектоустойчивости сервера я установил ограничение в 100 зарегистрированных пользователей.

И последнее: если Вы сидите за роутером, нужно сделать редирект порта 7373 на свою машину.

Автор: jatx

Источник [15]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/74587

Ссылки в тексте:

[1] «Транслируем звук по сети с помощью Java»: http://habrahabr.ru/post/242949/

[2] посмотреть на github: https://github.com/tabatsky/jatx/tree/master/NetworkingAudioClientServer

[3] RegisterServlet: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/NetworkingAudioServer/src/jatx/networkingaudioserver/RegisterServlet.java

[4] ConfirmServlet: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/NetworkingAudioServer/src/jatx/networkingaudioserver/ConfirmServlet.java

[5] UpdateIPServlet: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/NetworkingAudioServer/src/jatx/networkingaudioserver/UpdateIPServlet.java

[6] GetUserInfoServlet: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/NetworkingAudioServer/src/jatx/networkingaudioserver/GetUserInfoServlet.java

[7] MyDBConnect: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/NetworkingAudioServer/src/jatx/networkingaudioserver/MyDBConnect.java

[8] Main: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/Main.java

[9] Master: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/Master.java

[10] Slave: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/Slave.java

[11] IPUpdater: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/IPUpdater.java

[12] Util: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/Util.java

[13] DeclinedException: https://github.com/tabatsky/jatx/blob/master/NetworkingAudioClientServer/jNetworkingAudioClient/src/jatx/jNetworkingAudioClient/DeclinedException.java

[14] Здесь: https://yadi.sk/d/fFakH3iccixVC

[15] Источник: http://habrahabr.ru/post/243291/