- PVSM.RU - https://www.pvsm.ru -
В предыдущей статье «Транслируем звук по сети с помощью Java» [1] я описывал способ приема и трансляции звука по сети встроенными средствами Java.
Здесь я продолжу развивать эту идею, и расскажу, как сделать с помощью Java простую систему IP-телефонии.
Система IP-телефонии состоит из серверной части, которая хранит учетные данные пользователей и их текущие IP, и консольного клиента, который способен совершать и принимать звонки напрямую от второго абонента.
Полностью исходники можно посмотреть на github [2].
Всех заинтересовавшихся прошу под кат.
Серверная часть работает на базе сервлетов, 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 не обновлялся более трех минут.
Для установки серверной части нужно:
Консольный клиент состоит из четырех классов с программной логикой — 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/
Нажмите здесь для печати.