Пензенский государственный технологический университет
РЕАЛИЗАЦИЯ TCP-СОЕДИНЕНИЯ НА ОСНОВЕ ТЕХНОЛОГИИ РЕАКТИВНОГО ПРОГРАММИРОВАНИЯ
Маркин Е.И., Рябова К.М., Воронцов А.А.
Во время разработки приложений, работающих с удаленным сервером, часто приходится реализовывать TCP-соединение с сервером для передачи данных. Одним из способов упрощения реализации данной задачи может быть использование реактивного подхода к программированию. Реактивное программирование основано на работе с потоками данных.
Самый простой способ реализации TCP-соединений может выглядеть так как показано на рис. 1.
Рис. 1 Пример реализации TCP-соединения
В приведенном коде connect() - создает java.net.Socket и подключается к серверу, sendBytes() пишет в output-поток сокета, readAnswer() читает из input-потока сокета.
Данный код имеет ряд недостатков, а именно: блокировка записи/чтения, неудобная обработка ошибок и т.д.. Эти и другие проблемы можно решить при помощи RxJava.
RxJava - это библиотека, базирующаяся на технологии ReactiveX (Rx) с открытым исходным кодом, которая изначально разрабатывалась компанией Netflix. Она позволяет быстро и без затруднений писать реактивный код.
Приведенный выше код, написанный с использованием RxJava будет выглядеть как показано на рис. 2.
Рис. 2 Пример TCP-соединения с использованием RxJava
Отличие данного кода заключаются в том, что теперь метод send() возвращает Observable, а не String. Т.е. в результате мы получаем поток с данными, на который нам нужно подписаться при помощи Subscribe и в нем указать, что нужно делать с данными и ошибками.
Для обработки ошибок в RxJava предусмотрены операторы: doOnError(), onErrorReturn(), onErrorResumeNext(), onExceptionResumeNext(), данные операторы собирают ошибки, которые возникают во время выполнения операторов и передают их в обработчик исключений в subscribe(). Оператор retry() повторяет попытку обработки данных n-е количество раз во время получения ошибки. Добавив данные операторы, получаем следующий (рис. 3).
соединение сервер приложение оператор
Рис. 3 Код TCP-соединения с добавлением операторов для обработок ошибок
Для вынесения выполнения данной задачи в отдельный поток существуют операторы:
observeOn() и subscribeOn(). subscribeOn()- переносит выполнение всех операторов, которые указаны выше него, в указанный поток. observeOn() - переносит выполнение операторов, находящихся ниже него, в указанный поток. Комбинирование данных операторов позволяет легко и быстро переключаться между разными потоками (рис. 4).
1. Introduction to Rx / Lee Campbell. 2012. 354 c.
2. Официальный сайт ReactiveX: портал [Электронный ресурс]. Режим доступа: http://reactivex.io/ свободный. Загл. с экрана.
3. Манифест реактивного программирования: портал [Электронный ресурс]. Режим доступа: http://www.reactivemanifesto.org/ свободный. Загл. с экрана.
4. Маркин Е.И. мобильная разработка для абитуриентов / Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов // Сборник статей VI международной НПК “Наука и образование: сохраняя прошлое, создаём будущее”. Пенза: "Наука и Просвещение". 2016. С. 30-32.
5. Маркин Е.И. Технология реактивного программирования / Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов // Cборник статей победителей IV международной НПК “Инновационные научные исследования: теория, методология, практика”. Пенза: "Наука и Просвещение". 2016. С. 44-47.
6. Маркин Е.И. Использование технологии реактивного программирования при работе с геолокацией. /Е.И. Маркин, К.М. Рябова, А.Н. Пименов, Н.А. Левина, А.А. Воронцов// Cборник статей победителей VI Международной НПК “WORLD SCIENCE: PROBLEMS AND INNOVATIONS”. Пенза: "Наука и Просвещение". 2016. С. 86-89.