Почему Flash Media Server не вызывает обработчик application.onDisconnect?

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

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

11.12.2008 15:33:19
3 ОТВЕТА
РЕШЕНИЕ

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

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

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


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

Если клиент является компонентным приложением, ему необходимо [правильно обрабатывать события подключения] [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 распространяют подобные исключения, их необходимо отслеживать, а затем перехватывать в клиентском приложении.

3
23.05.2017 12:13:33
ХОРОШО. Спасибо. Я знаю, как обрабатывать события подключения на клиенте. И что? Как это поможет мне преодолеть мою проблему на стороне сервера? Тонна случайного текста еще не хороший ответ.
Artem Tikhomirov 4.02.2009 02:19:52
@ Артем: Я согласен и оставил комментарий к вашему ответу, объясняя мою позицию по этому вопросу. Я обновил свой ответ, чтобы отразить его.
VonC 4.02.2009 05:21:45
О, я прошу прощения - я был просто придурком. В любом случае, спасибо за ваш ответ.
Artem Tikhomirov 4.02.2009 23:33:05

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

14
28.01.2009 05:17:52
Привет Рик, по словам автора этого вопроса, ваш ответ кажется правильным. Не могли бы вы тогда проголосовать за stackoverflow.uservoice.com/pages/general/suggestions/… ?
VonC 4.02.2009 07:06:42
Привет, Рик, у тебя еще есть профиль пользователя или очки пользователя? Поскольку голосование stackoverflow.uservoice.com/pages/general/suggestions/… было бы хорошей идеей;)
VonC 4.02.2009 15:03:03
Привет, спасибо, я проголосовал :) (впервые я использовал эту функцию) спасибо за внимание!
Ric Tokyo 4.02.2009 15:41:29
Привет Рик, так как моя запись в пользовательском счете была отклонена (см. Мой обновленный ответ выше), здесь +1 для вашего хорошего ответа. 14 других +1 будут следовать один раз в день, чтобы не портить ежедневную предельную сумму в 200
VonC 5.02.2009 05:10:51

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

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

У меня есть этот пример ActionScript на стороне сервера:

// 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-клиента.

4
1.02.2009 23:33:23