В предыдущей статье «Мы транслируем звук по сети с помощью Java» Я описал метод приема и трансляции звука по сети с помощью встроенных средств Java. Здесь я продолжу развивать эту идею и расскажу, как сделать простую систему IP-телефонии с помощью Java. Система IP-телефонии состоит из серверной части, хранящей учетные данные пользователей и их текущий IP-адрес, и консольного клиента, способного совершать и принимать звонки непосредственно от второго абонента.
Полные исходники доступны посмотри на гитхабе .
Прошу всех интересующихся под катом.
NetworkingAudioServer — серверная часть системы
Серверная часть работает на сервлетах Apache Tomcat и MySQL.Структура базы данных
База данных состоит из двух таблиц: пользователи - хранит учетные данные пользователя и информация о пользователе — соответствует IP-адресу каждого пользователя и времени его последнего обновления.
Титулы электронная почта И пароль говорить за себя подтверждать — токен подтверждения адреса электронной почты или 'сделанный' , если адрес электронной почты подтвержден, ID пользователя — md5-хеш адреса электронной почты (поскольку он имеет фиксированную длину, его удобно использовать для идентификации входящего звонка).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;
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;
Поля электронная почта И ID пользователя соответствуют полям из предыдущей таблицы, что такое IP понятно из названия, последнее обновление — время последнего обновления IP.
Сервлеты
Регистрациясервлета регистрирует пользователя в базе данных и отправляет запрос на подтверждение по электронной почте, используя следующий скрипт: #!/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: [email protected]" >> $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
Подтвердитьсервлет — выполняет подтверждение по электронной почте.
ОбновлениеIPсервлет — обновляет IP клиента по запросу, IP определяется автоматически.
GetUserInfoServlet — принимает в качестве параметра электронная почта или ID пользователя , по запросу возвращает электронная почта или ID пользователя и текущий IP или значение 'не в сети' , если IP не обновлялся более трёх минут.
Настройка серверной части
Для установки серверной части необходимо:- Создать базу данных MySQL
- Укажите в классе правильные значения логина, пароля и базы данных MySQL. MyDBConnect
- Сборка и развертывание в Tomcat
- Пожалуйста, введите правильное значение SERVER_URL в скрипте отправки почты поместите сам скрипт в /common_scripts/sendConfirm и установите права на выполнение
- Создайте папку /common_scripts/tmp и установите права на запись.
jNetworkingAudioClient — консольный клиент
Структура клиента
Консольный клиент состоит из четырех классов с программной логикой — Основной , Владелец , Раб И IPUpdater , и два вспомогательных класса - Утилита И Отклоненное исключение .Сорт Утилита хранит настройки клиента, такие как параметры звука и размер буфера.
Сорт Основной отвечает за программную логику интерфейса.
Сорт IPUpdater отправляет запрос сервлету на обновление IP каждые 90 секунд. Сорт Владелец слушает сетевой порт и, в свою очередь, содержит два вложенных класса потока: МикрофонЧитатель - считывает данные с микрофона и Отправитель — отправляет данные второму абоненту.
Сорт Раб : Инициирует соединение, отправляя второй стороне хеш-код md5 адреса электронной почты, затем, если вызов принят, начинает считывать данные из сокета и отправлять их на аудиовыход. Подробно устройство клиента описывать, пожалуй, не буду — с исходным кодом может ознакомиться каждый.
Запуск клиента
Здесь можно взять готовый исполняемый jar. Запуск: java -jar jNetworkingAudioClient.jar http://serverUrl 2>log.txt
Желающие могут попробовать на моем сервере:
java -jar jNetworkingAudioClient.jar http://tabatsky.ru/networkingaudio/ 2>log.txt
Но: чтобы сделать сервер более эффективным, я установил ограничение в 100 зарегистрированных пользователей.
И напоследок: если вы сидите за роутером, вам нужно сделать перенаправить порт 7373 к вашей машине.
УПД:
Есть небольшая проблема — когда я пытаюсь обновить собственный IP через внешний хост, сервлет вместо моего внешнего IP получает IP моего роутера во внутренней сети — 192.168.1.1. Я придумал небольшой костыль — триггер для MySQL: CREATE TRIGGER `my_host_ip` BEFORE INSERT ON `userinfo`
FOR EACH ROW SET NEW.ip=IF(NEW.ip='192.168.1.1','tabatsky.ru',NEW.ip);
Теги: #java #tomcat #MySQL #Звук #сеть #ip-телефония #java
-
Атомное Сотрудничество Microsoft
19 Oct, 24 -
Просто Позвони За 5 Копеек
19 Oct, 24 -
Для Фанатов Супер Марио
19 Oct, 24