Java: IP-телефонія з нуля

У попередній статті «Транслюємо звук по мережі за допомогою Java» я описував спосіб прийому і трансляції звуку по мережі вбудованими засобами Java.

Тут я продовжу розвивати цю ідею, і розповім, як зробити з допомогою Java просту систему IP-телефонії.

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

Повністю исходники можна подивитися на github.

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


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 реєструє користувача в базі даних та надсилає на електронну пошту запит на підтвердження такого скрипта:

#!/bin/sh
email=$1
confirm=$2
SERVER_URL="http://tabatsky.ua/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


ConfirmServlet — виконує підтвердження e-mail.

UpdateIPServlet — оновлює IP клієнта при запиті, IP визначається автоматично.

GetUserInfoServlet — як параметр приймає email або user_id, при запиті повертає email або user_id і поточний IP, або значення 'offline', якщо IP не оновлювався більше трьох хвилин.

Налаштування серверної частини


Для установки серверної частини потрібно:
  • Створити базу даних MySQL
  • Вказати правильні значення логіна, пароля і бази даних MySQL в класі MyDBConnect
  • Зібрати і задеплоить на Tomcat
  • Вказати правильне значення SERVER_URL в скрипті відправки пошти, сам скрипт розмістити за адресою /common_scripts/sendConfirm і встановити права на виконання
  • Створити папку /common_scripts/tmp і встановити права на запис


jNetworkingAudioClient — консольний клієнт



Структура клієнта


Консольний клієнт складається з чотирьох класів з програмною логікою — Головна, Master, Slave і IPUpdater, і двох допоміжних класів — Util і DeclinedException.

Клас Util зберігає налаштування клієнта — такі як параметри звуку та обсяг буфера.

Клас Main відповідає за програмну логіку інтерфейсу.

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

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

Клас Slave: ініціює з'єднання, відправляючи другого абоненту md5-хеш адреси електронної пошти, потім, якщо дзвінок прийнятий, починає читати дані з сокета і відправляти їх на аудіо-вихід.

Більш докладно описувати пристрій клієнта, мабуть, не буду — всі бажаючі можуть ознайомитися з вихідним кодом.

Запуск клієнта


Тут можна взяти готовий виконуваний jar.

Запуск:

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


Бажаючі можуть спробувати на моєму сервері:

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


Але: в цілях хабраэффектоустойчивости сервера я встановив обмеження у 100 зареєстрованих користувачів.

І останнє: якщо Ви сидите за роутером, потрібно зробити редирект порту 7373 на свою машину.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.