/data/send - возвращает ошибку

Ritmius

Member
{
"nodeId":"62cjXxRa99MhToFv0RWUFWsoHwSE81W5@206.189.5.114",
"operationId":"d1999750-fde9-11e6-9f1b-913210792936", --- где это взять? я рандом ставлю
"sessionId": "/134.17.27.208:58008/206.189.5.114:8443-e0c7f857-9554-4831-a24a-096e21a8c086",
"payload":{
"message":"hello"
}
}

----
Ответ 500
{
"exception": "com.flashphoner.rest.server.exception.InternalErrorException",
"path": "/rest-api/data/send",
"error": "Internal Server Error",
"message": null,
"timestamp": 1616070529961,
"status": 500
}

в логах
12:28:49,960 INFO RestApiRouter - HTTPS-pool-5-thread-90 Use controller class com.flashphoner.rest.server.rest_v2.RestDataController with path /rest-api/data/send


12:28:49,961 INFO RestCallController - HTTPS-pool-5-thread-90 handleRequest /rest-api/data/send params:{nodeId=62cjXxRa99MhToFv0RWUFWsoHwSE81W5@206.189.5.114, operationId=d1999750-fde9-11e6-9f1b-913210792936, sessionId=/134.17.27.208:58008/206.189.5.114:8443-e0c7f857-9554-4831-a24a-096e21a8c086, payload={message=hello}}


12:28:49,961 ERROR RestCallController - HTTPS-pool-5-thread-90 Got remote exception while sending data to client!


com.flashphoner.server.commons.rmi.operations.exception.ClientNotFoundException
at com.flashphoner.rest.server.NodeApi.sendData(Unknown Source)
at com.flashphoner.rest.server.rest_v2.RestDataController.send(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.flashphoner.rest.server.RestApiRouter.processRequest(Unknown Source)
at com.flashphoner.server.http.handlers.RestApiRequestHandler.process(Unknown Source)
at com.flashphoner.server.http.G.messageReceived(Unknown Source)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(Unknown Source)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(Unknown Source)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(Unknown Source)
at org.jboss.netty.handler.stream.ChunkedWriteHandler.handleUpstream(Unknown Source)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(Unknown Source)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(Unknown Source)
at org.jboss.netty.handler.codec.http.HttpChunkAggregator.messageReceived(Unknown Source)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(Unknown Source)
 
Last edited:

Ritmius

Member
Сообщение отправить удалось. конкретному слушателю, а как сделать это всем?
 

Max

Administrator
Staff member
Убедитесь в следующем:

1. Метод POST
2. Передан HTTP Заглоловок Content-Type: application/json
3. Существует коннект к серверу с таким sessionId. Например через /rest-api/connection/find_all

1616075041161.png


Проверили на демо сервере demo.flashphoner.com
У нас работает. На стороне вебсокета приходит событие OnDataEvent


1616075150584.png
 

Max

Administrator
Staff member
Сообщение отправить удалось. конкретному слушателю, а как сделать это всем?
Чтобы отправить всем, надо отправить несколько сообщений каждому.
 

Ritmius

Member
а можно сделать вебхук на сообщение которое содержит какие то спец символы?
мы боремся с микрофоном, чтобы подсвечивать пользователя и встал вопрос безопасности, что кто угодно в результате может говорить что я говорю

как сделать безопасность?
 

Max

Administrator
Staff member
Не понятен вопрос по безопасности в контексте /data/send

Вы опасаетесь что кто угодно сможет отправить /data/send ? Или что пользователь может поменять JavaScript и давать всем сигналы через session.sendData() что он в данный момент говорит?

В случае /data/send вы можете полностью закрыть API и оставить его открытым только для вашего бэкенда и на бэкенде решать кому можно отправлять кому нельзя.

В случае session.sendData() вы передаете например payload: {token:"123"} и получаете хук OnDataEvent, в котором можно взять полученный токен и принять решение отрабатывать этот хук или нет.
 

Ritmius

Member
понятно. а можно ли подтянуть последние сообщения, когда новый заходит в комнату?

пользователь чата как может послать сообщение всем? не через наш бекенд, а напрямую через Flashphoner , только перебор в цикле всех? или можно всем?


Я еще где то видел, что можно какие то модули свои подключать как модуль и он делает логику
 
Last edited:

Max

Administrator
Staff member
Разослать всем можно только в том случае, если пользователь подключился через Room API к конкретной комнате.
Микшер комнатой не является.

Пример простого подключения:


При простом подключении надо задействовать бэкенд и хуки чтобы разослать сообщение.

Code:
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function (session) {

        setStatus("#connectStatus", session.status());

        onConnected(session);

    }).on(SESSION_STATUS.DISCONNECTED, function () {

        setStatus("#connectStatus", SESSION_STATUS.DISCONNECTED);

        onDisconnected();

    }).on(SESSION_STATUS.FAILED, function () {

        setStatus("#connectStatus", SESSION_STATUS.FAILED);

        onDisconnected();

    });
Пример подключения к комнате:

При подключении к комнате, WCS сервер сам реализует бэкенд и хуки рассылки сообщений по комнате http://localhost:8081/ChatRoomApp
Сообщение рассылается с помощью sendMessage()


Примеры также описаны в документации.
Code:
function createConnection(url, username) {

    connection = Flashphoner.roomApi.connect({urlServer: url, username: username}).on(SESSION_STATUS.FAILED, function(session){

        setStatus('#status', session.status());

        onLeft();

    }).on(SESSION_STATUS.DISCONNECTED, function(session) {

        setStatus('#status', session.status());

        onLeft();

    }).on(SESSION_STATUS.ESTABLISHED, function(session) {

        setStatus('#status', session.status());

        joinRoom();

    });

}
 

Ritmius

Member
правильно ли я вас понял, можно отправить одно сообщение от клиента и оно будет разослано всем участникам конференции?

и для этого не нужно делать цикл?

Как это сделать по примеру выше непонятно, sendMessage() сообщение получат все участники комнаты?
 

Max

Administrator
Staff member
Посмотрите, пожалуйста, исходный код примера Conference (используется в том числе в примере Video Chat) на GitHub
Необходимо вызвать [SIZE=4]roomApi.Room.Participant.sendMessage() для каждого участника:[/SIZE]
JavaScript:
        var participants = room.getParticipants();
        for (var i = 0; i < participants.length; i++) {
            participants[i].sendMessage(message);
        }
 

Ritmius

Member
еще раз попробую задать вопрос, участник с клиента шлет всем в цикле сам? или ваш флешфонер может разослать сам всем, а нам с клиента только один раз отправить можно?

цикл с клиента = КОСТЫЛЬ при 5000 в комнате

Сервер может сам?
 

Max

Administrator
Staff member
еще раз попробую задать вопрос, участник с клиента шлет всем в цикле сам? или ваш флешфонер может разослать сам всем, а нам с клиента только один раз отправить можно?
При использовании RoomApi участник шлет сообщения для каждого участника сам.
цикл с клиента = КОСТЫЛЬ при 5000 в комнате
Известны примеры внедрений с количеством участников до 700 в одной комнате.
Сервер может сам?
Только если Вы реализуете собственный бэкенд, который сам разошлет сообщение клиентам. В любом случае, бэкенд для этого должен вызвать /data/send c sessionId каждого участника.
 
Top