professional gratis full flex flash flash-media-server

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ícitos onConnectAccept y onConnectReject .

Necesita incluir código para manejar estos eventos.
Cuando utiliza componentes, debe modificar la instrucción application.onConnect en su código del lado del servidor para incluir los controladores de eventos application.onConnectAccept y application.onConnectReject .
La última línea (en orden de ejecución) de su controlador onConnect debe ser application.acceptConnection() o application.rejectConnection() .

Si su aplicación requiere código adicional siguiendo los acceptConnection() explícitos acceptConnection() o rejectConnection() , como un mensaje que indique que se le ha concedido o denegado permiso a la aplicación, debe colocar ese código en la application.onConnectAccept o application.onConnectReject declaraciones.

SUGERENCIA: Si no está utilizando componentes multimedia, no puede usar application.onConnectAccept y application.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