Использование функции sendData

Ras2607

Member
Здравствуйте!
Есть задача.
создать полноценную комнату для проведения вебинара, умеющую:
1. транслировать вебкамеру
2. чат
3. показывать слайды (ведущий управляет, зрители видят менющиеся картинки)

С первым и вторым все понятно и реализовать уже удалось. По поводу слайдов Ваша техподдержка подсказала использовать функцию sendData для передачи картинок. Можете подсказать хороший пример для понимания принципов работы этой функции? А то в документации все очень уж размыто. Или же возможно есть какое-то другое решение подходящее под реализацию слайдов?
 

Max

Administrator
Staff member
Добрый день.

Websocket и sendData

WCS работает как Websocket-сервер.
Т.е. можно отправить массив текстовых данных с web-страницы через Websocket на WCS и далее на Web-сервер по REST.
И обратно. WCS можно дать REST-команду отправить объект данных клиенту, имеющему соединение с сервером.
Таким образом, вы можете запаковать ваш слайд в текстовый объект. Например PNG - Base64, и отправить методом sendData(object).
Процесс будет выглядеть так:
1. C HTML-страницы вызывается метод session.sendData(object)
2. WCS перенаправляет этот вызов на ваш Web-сервер на URL /OnDataEvent
3. Ваш скрипт получает данные и парсит из тела HTTP / JSON -запроса
4. Ваш скрипт решает, кому из поключенных к WCS-серверу клиентов перенаправить этот объект.
5. Ваш скрипт обращается к WCS по REST/HTTP адресу http://host:9091/RestCallback/sendData и передает объект и sessionId коннекта, которому адресован этот объект.
6. Клиент получает событие session.on(SESSION.APP_DATA, function(){...});

REST методы
Для реализации вам нужно обрабатывать на стороне web-сервера как минимум 2 метода
1. /connect
Этот метод несет sessionId
2. /OnDataEvent
В этом методе WCS передает данные, полученные с клиента, вызывающего sendData()

Реализация клиент - сервер
В API flashphoner.js, есть метод session.sendData(object);
https://flashphoner.com/docs/api/WCS5/client/web-sdk/latest/Session.html (API doc)
Его можно вызвать так
Code:
session.sendData({'name':'value'});
В результате WCS отправит REST / HTTP вызов по адресу http://localhost:9091/EchoApp/OnDataEvent
И в теле HTTP-запроса будет JSON-объект:
Code:
{name: 'value'}
Этот вызов подробно расписан на этой странице.
По-умолчанию, для всех подобных вызвов используется адрес http://localhost:9091/EchoApp - этот адрес всегда работает как Echo и отдаёт то, что получил.
Вам нужно на стороне веб-сервера написать скрипт, который будет отвечать с Echo на всех адресах:
http://mysite/api/connect
http://mysite/api/pyblishStream
http://mysite/api/playStream
http://mysite/api/OnDataEvent
и т.д.
Далее указываете WCS использовать ваш URL. Создаете маппинг:
Code:
add app myApp myAppKey "http://mysite/api"
Как это сделать показано здесь.
Теперь при создании сессии, если указать myAppKey, то все REST вызовы будут заворачиваться на ваш URL.
Code:
Flashphoner.createSession({appKey:'myAppKey'});

Реализация сервер - клиент

Вызываете REST / HTTP / POST / application/json метод:
http://host:9091/RestCallback/sendData
И передаете в теле JSON:
Code:
{
nodeId:'...'
sessionId:'..'
operationId:'..'
payload: {'test':'test'}
}
В результате, клиент, которому адресовано это сообщение, получает событие:
session.on(SESSION.APP_DATA,function(){...});
И обрабатывает его (показывает слайд в вашем случае).

Примеры

В итоге нужно реализовать
1. sendData с клиента на сервер
2. sendData с сервера на клиент
Если реализуете, сможете управлять обменам слайдами и другой информацией. Например сообщениями чата, фотографиями, и т.д., т.к. sendData не накладывает ограничений на содержание объектов.
В качестве примера можно привести видеочат, в котором обмен текстовыми сообщениями построен на sendData
https://wcs5-eu.flashphoner.com/demo2/video-chat
Чат использует room-module.js, который и вызывает sendData
session.sendData(command);
Code:
function sendAppCommand(commandName, data) {
            var command = {
                command: commandName,
                options: data
            };
            return session.sendData(command);
        }
На стороне web-сервера (Tomcat), получение данных от подключенного клиента выглядит так:
Code:
@RequestMapping(value = "/RoomApp/OnDataEvent")
public Map<String, Object> handleRequest(@RequestBody Map<String, Object> params) {
Data data = objectMapper.convertValue(params, Data.class);
...
}
На стороне web-сервера (Tomcat), отправка данных подключенному клиенту выглядит так:
Code:
private void sendEvent(User user, Event event) {
        log.info("sendEvent to user " + user.getConnection().getSessionId());
        Data data = new Data();
        data.setSessionId(user.getConnection().getSessionId());
        data.setOperationId(UUID.randomUUID().toString());
        data.setPayload(event);
        // send data to REST http://host:9091/RestCallback/sendData
    }
 
Last edited:

Ras2607

Member
Благодарю! Реализовать получилось. Но вот новый вопрос:
Как управлять теми кто получит данные через sendData ?
Конкретней - мне отлично подошло Ваше roomApi
и параллельно в нем могут быть открыты несколько комнат.
Так вот - как ведущему комнаты 1 послать слайд только зрителям из комнаты 1 и никому больше?
 

Max

Administrator
Staff member
roomApi работает по следующему принципу:
Все подключенные к комнате пользователи имеют равные права и все получают одинаковую информацию.
Т.е. если пользователь публикует поток, то все пользователи в этой комнате получают уведомление.
Code:
Так вот - как ведущему комнаты 1 послать слайд только зрителям из комнаты 1 и никому больше?
Можно отправить сообщение конкретному участнику.
Code:
participant.sendMessage();
https://flashphoner.com/docs/api/WCS5/client/web-sdk/latest/roomApi.Room.Participant.html
Например в конференции, пробегаем по всем участникам и отправляем каждому сообщение: line 31
Т.е. нужно пробежать только по зрителям и отправить слайды только им.
 

Max

Administrator
Staff member
Да, проблем быть не должно, если запаковать слайд в текст.
 

Ras2607

Member
проверил - реально приходит. получается с рест вызовами ничего мудрить и не надо, отлично!
 
Top