Java: Ip-Телефония С Нуля

В предыдущей статье «Мы транслируем звук по сети с помощью Java» Я описал метод приема и трансляции звука по сети с помощью встроенных средств Java. Здесь я продолжу развивать эту идею и расскажу, как сделать простую систему IP-телефонии с помощью Java. Система IP-телефонии состоит из серверной части, хранящей учетные данные пользователей и их текущий IP-адрес, и консольного клиента, способного совершать и принимать звонки непосредственно от второго абонента.

Полные исходники доступны посмотри на гитхабе .

Прошу всех интересующихся под катом.



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

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

Структура базы данных
База данных состоит из двух таблиц: пользователи - хранит учетные данные пользователя и информация о пользователе — соответствует 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;

Титулы электронная почта И пароль говорить за себя подтверждать — токен подтверждения адреса электронной почты или 'сделанный' , если адрес электронной почты подтвержден, 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;

Поля электронная почта И 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
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.