Почему Flash Media Server не вызывает обработчик application.onDisconnect? - PullRequest
1 голос
/ 11 декабря 2008

Я столкнулся со странной проблемой в моем приложении Flex / Flashcom. Если клиентское приложение неожиданно отключается от сервера, последний не вызывает функцию-обработчик application.onDisconnect. В сторону ведьмы я должен смотреть? Спасибо.

Обновление Я не использую серверные компоненты, но размещаю эту штуку в Linux.

Ответы [ 3 ]

14 голосов
/ 28 января 2009

Если это так, это задокументировано и здесь интересный форум для подражания .. в основном для Linux он может работать немного сумасшедшим, как:)

4 голосов
/ 02 февраля 2009

Возможно, клиент отключен до того, как (Flash Media-) сервер «узнает» об этом. Так что никакая функция onDisconnect не вызывается (она никогда не вызывается клиентом) до очень и очень позднего времени.

Если вы хотите обнаружить (и отреагировать) «длительное» отключение на ранней стадии, используйте метод client.getStats ().

У меня есть пример сценария действий на стороне сервера:

// add method to standard class
Client.prototype.isAlive = function() {
        var stats = this.getStats();
        var timeout_value = 3 * 1000;  // in ms.
        //trace('Measured timeout: ' + stats['ping_rtt']);
        if (stats)
                return (stats['ping_rtt'] < timeout_value);
}

// use this in an interval which traverses the application.clients list
if (! client.isAlive())
    application.disconnect(client);

Вы можете активировать и протестировать поведение «отсутствует onDisconnect», отсоединив сетевой кабель от подключенного Flash-клиента.

3 голосов
/ 28 января 2009

Как упомянул Артем Тихомиров (автор вопроса) в своем собственном ответе , мой ответ бесполезен (я держу его ниже как вики для архива).

Реальный ответ дал Рик Токио относительно ошибки в Linux и задокументирован в этой теме .

Единственная причина, по которой мой ответ «выбран», заключается в том, что Артем не выбрал какой-либо другой ответ (или собственный ответ) до 7-дневного срока, предоставив мне (первый и наиболее одобренный ответ) половину баллов. (75 на 150) автоматически , как объяснено в этой записи блога SO .


Первый отрыв:

Если клиент является компонентным приложением, ему необходимо [правильно обработать события подключения] [9].

При разработке приложений имейте в виду, что использование компонентов приводит к явным событиям onConnectAccept и onConnectReject.

Вам нужно включить код для обработки этих событий.
При использовании компонентов необходимо изменить оператор application.onConnect в коде на стороне сервера, включив обработчики событий application.onConnectAccept и application.onConnectReject.
Последняя строка (в порядке выполнения) вашего обработчика onConnect должна быть либо application.acceptConnection(), либо application.rejectConnection().

Если вашему приложению требуется дополнительный код, следуя явным методам acceptConnection() или rejectConnection(), таким как сообщение, указывающее, что пользователю предоставлено или отказано в разрешении для приложения, этот код следует поместить в application.onConnectAccept или application.onConnectReject заявления.

СОВЕТ: Если вы не используете мультимедийные компоненты, вы не можете использовать application.onConnectAccept и application.onConnectReject.


Затем вы можете проверить любое сообщение об ошибке на панели вывода Flash, например:

Error #2044: NetStatusEvent non pris en charge : level=error, code=NetStream.Play.Failed
    at MethodInfo-1()
Error #2044: NetStatusEvent non pris en charge : level=error, code=NetStream.Record.NoAccess
    at MethodInfo-1()

Это указывало бы на то, что исключение сервера не было учтено клиентом и вызвало неожиданный выход.

Если клиент читает поток с сервера, он должен убедиться:

  • NetConnection успешно
  • NetStreams (вход и выход) слушают NET_STATUS

Хороший код хотел бы это:

var status:Function = function( e:NetStatusEvent ):void
{
    trace( "status : " + e.info.code ) ;
    if ( e.info.code == "NetConnection.Connect.Success" )
    {
        streamOut = new NetStream( nc ) ;
        streamOut.addEventListener( NetStatusEvent.NET_STATUS , status ) ;

        streamIn  = new NetStream( nc ) ;
        streamIn.addEventListener( NetStatusEvent.NET_STATUS , status ) ;

        streamOut.attachCamera( cam ) ;
        video.attachNetStream( streamIn ) ;

        streamOut.publish( "private" ) ;
        streamIn.play( "private" ) ;       
    }
}

Поскольку новые версии FlashPlayer распространяют подобные исключения, их необходимо отслеживать, а затем перехватывать в клиентском приложении

...