flex - gratis - ¿Por qué Flash Media Server no llama a application.onDisconnect handler?
adobe media server 5 professional full (3)
Si es así, está documentado y aquí un foro interesante a seguir ... básicamente en Linux puede funcionar un poco loco como :)
Me he encontrado con un problema extraño en mi aplicación Flex / Flashcom. Si la aplicación del cliente se desconecta inesperadamente del servidor, no llama a la función del controlador application.onDisconnect. En la dirección de la bruja debería mirar? Gracias.
Actualizo que no estoy usando componentes de servidor, pero sí alojo esto en Linux.
Es posible que un cliente se desconecte antes de que el servidor (Flash Media-) ''sepa'' sobre esto. Por lo tanto, no se invoca ninguna función ''onDisconnect'' ( nunca es invocada por el cliente) hasta muy, muy tarde.
Si desea detectar (y actuar sobre) desconexiones "persistentes" anticipadamente, utilice el método client.getStats ().
Tengo este ejemplo del actionscript del lado del servidor:
// 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);
Puede desencadenar y probar este comportamiento de "falta de Desconexión" al quitar el cable de red del cliente Flash conectado.
Como menciona Artem Tikhomirov (el autor de la pregunta) en su propia respuesta , mi respuesta no es útil (sigo aquí abajo como wiki, para el archivo).
La respuesta real ha sido dada por Ric Tokyo con respecto a un error en Linux , y está documentado en este hilo .
La única razón por la que mi respuesta es "elegida" es porque Artem no eligió ninguna otra respuesta (o una respuesta propia) antes de los límites de 7 días, dándome (la primera y más votada respuesta) la mitad de los puntos de recompensa (75 sobre 150) automáticamente como se explica en esta entrada SO blog .
Primera ventaja:
Si el cliente es una aplicación basada en componentes, necesita [manejar eventos de conexión correctamente] [9].
Cuando desarrolle aplicaciones, tenga en cuenta que el uso de componentes introduce
onConnectAccept
explícitosonConnectAccept
yonConnectReject
.Necesita incluir código para manejar estos eventos.
Cuando utiliza componentes, debe modificar la instrucciónapplication.onConnect
en su código del lado del servidor para incluir los controladores de eventosapplication.onConnectAccept
yapplication.onConnectReject
.
La última línea (en orden de ejecución) de su controladoronConnect
debe serapplication.acceptConnection()
oapplication.rejectConnection()
.Si su aplicación requiere código adicional siguiendo los
acceptConnection()
explícitosacceptConnection()
orejectConnection()
, como un mensaje que indique que se le ha concedido o denegado permiso a la aplicación, debe colocar ese código en laapplication.onConnectAccept
oapplication.onConnectReject
declaraciones.SUGERENCIA: Si no está utilizando componentes multimedia, no puede usar
application.onConnectAccept
yapplication.onConnectReject
.
Luego, es posible que desee verificar cualquier mensaje de error en el panel de salida de Flash, como:
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()
Eso indicaría una excepción de servidor no tomada en cuenta por el cliente, forzando una salida inesperada.
Si el cliente lee una secuencia desde el servidor, debe asegurarse de que:
- NetConnection ha tenido éxito
- NetStreams (entrada y salida) escucha NET_STATUS
Un buen código le gustaría esto:
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" ) ;
}
}
Dado que las nuevas versiones de FlashPlayer sí propagan ese tipo de excepción, deben ser monitoreadas y luego atrapadas en la aplicación cliente