He hecho un chat con el siguiente tutorial : http://www.cristalab.com/tutoriales/como-crear-un-chat-en-flash-c105l/
El chat ya lo hice entero pero el problema es que cuando intento entrar me queda en cargando y no arranca y ya me estoy poniendo un poco nervioso .Por eso queria saber como podría solucionar ese problema.El código que utilizo es el siguiente:
Fotograma 1
Código :
//Traemos la clase "Usuario" de la carpeta "ClabServer" //Ten en cuenta que no es necesario poner la extensión .as //Pero SI debes colocar las mayusculas y minusculas como se debe import ClabServer.Usuario; //Debemos frenar la linea de tiempo para que no salte automaticamente stop(); /* INICIALIZACIÓN DE VARIABLES */ /*Creamos una instancia de la clase "Usuario", la que maneja el login al chat*/ var user:Usuario = new Usuario(); /* EVENTOS DEL MOUSE */ //Este evento se ejecutara al darle click al boton entrar entrar_btn.onRelease = function() { /* Usamos el metodo "login" de la clase "Usuario", que nos pide 3 parametros; el primero es el nick del usuario, el segundo es, la contraseña en caso de ser un usuario registrado (No es nuestro caso) y el tercero es una variable que en "verdadero" significa que sera un usuario anonimo, que en este caso, lo es */ user.login(nick_txt.text, "", true); //Ponemos en "aviso_txt" el anuncio de carga mientras recibimos respuesta aviso_txt.text = "Cargando . . . "; }; /* EVENTOS DEL CLABSERVER */ //La clase "Usuario" tiene un evento llamado "onLogin", que devuelve una //variable numerica llamada "respuesta"; esta cambiara de acuerdo a lo //ocurrido en el login de un usuario determinado user.onLogin = function(respuesta) { //La instrucción "switch" nos permitira elegir entre varias opciones //de repuesta switch (respuesta) { //Si el nombre de usuario ya esta en uso dentro del chat case Usuario.EN_USO : //Colocamos el aviso aviso_txt.text = "El nick esta en uso"; //Limpiamos la caja de texto del nick nick_txt.text = ""; //Salimos del switch break; //Si el nombre de usuario esta registrado en la DB del servidor case Usuario.REGISTRADO : aviso_txt.text = "El nick esta registrado"; nick_txt.text = ""; break; //Si no hay ningun problema case Usuario.OK : //Continuamos al siguiente keyFrame //Donde iniciara el proceso del chat gotoAndStop(2); break; } };
Fotograma 2
Código :
//Frenamos la linea de tiempo stop(); //Importamos la clase "Servidor" del "ClabServer" import ClabServer.Servidor; /* INICIALIZACIÓN DE VARIABLES */ /*"chat" es la conexión al servidor; una instancia de la clase "Servidor"; tiene 3 parametros, el primero es el usuario a entrar, en nuestro caso, es la variable "user", el segundo parametro sera la "sala de chat" a la que entraremos, que es un numero de 0 a 64999; en nuestro caso, sera la sala 1 */ var chat = new Servidor(user, 1); /* EVENTOS DEL BOTON */ // El evento que se ejecutara al dar click al boton "Enviar" enviar_btn.onRelease = function() { //Invocamos al metodo "enviar" de la clase "Servidor", cuyo // parametro es el mensaje a enviar al chat chat.enviar(mensaje_txt.text); //limpiamos el campo del mensaje mensaje_txt.text = ""; }; /* EVENTOS DEL CLABSERVER */ //El evento "onMensaje" se ejecuta cada vez que llega un mensaje //nuevo al chat; por parametro recibe un objeto que contiene el //nick y el mensaje del autor. chat.onMensaje = function(mensaje:Object) { //añadimos el mensaje junto con el nick al chat chat_txt.text += "<"+mensaje.Nick+"> "+mensaje.Mensaje+"\n"; }; //El evento "onEntrada" se ejecuta al entrar un nuevo usuario chat.onEntrada = function(userNuevo:Object) { //Avisamos en el chat de la entrada del nuevo usuario chat_txt.text += " * "+userNuevo.Nick+" ha entrado.\n"; }; //El evento "onSalida" se ejecuta al salir un usuario del chat chat.onSalida = function(userViejo:Object) { //Avisamos en el chat de la salida del usuario chat_txt.text += "** "+userViejo.Nick+" ha salido.\n"; };
Como yo tengo Flash CS5 he cambiado una cosita ya que me tiraba error.No se si tiene que ver con el error pero lo que hice fue cambiar el código de Usuario.as, que venia en el pack del tutorial ( en la linea 58 ):
Código :
mx.remoting.debug.NetDebug.initialize();
Por este:
Código :
fl.remoting.debug.NetDebug.initialize();
(Por si las moscas les dejo el codigo entero del archivo as):
Código :
import mx.remoting.NetServices; import mx.remoting.Connection; import mx.remoting.RecordSet; import mx.remoting.NetServiceProxy; import mx.remoting.debug.NetDebug; import ClabServer.*; class ClabServer.Servidor extends ClabServer.Control{ //Variables privadas private var user:ClabServer.Usuario; private var room:Number; private var hilo:Number; private var hiloDesc:Number; private var hiloClean:Number; private var lastStamp:String; private var mensajes:Array; private var usuarios:Array; private var servSend:NetServiceProxy; private var servList:NetServiceProxy; private var servConec:NetServiceProxy; //Propiedades estaticas publicas // Tipos de callback public static var MENSAJE = 0; public static var OBJETO = 1; public static var ENTRADA = 2; public static var SALIDA = 3; public static var LISTA = 4; public static var LAG = 5; public static var ERROR = 6; // Tipos de respuesta de servidor // 0: Texto // 1: Variable de datos // 2: Entrada de usuario // 3: Salida de usuario //Variables publicas public var onMensaje:Function; public var onEntrada:Function; public var onSalida:Function; public var onObjeto:Function; public var onLista:Function; public var onLag:Function; public var onError:Function; public var lag:Number; public var conectados:Number; public var cargandoMsg:Boolean; public var cargandoLst:Boolean; //SOLO PARA DEPURAR private var lagMsg:Number; private var lastLagMsg:Number; private var cLagMsg:Number; private var lagLst:Number; function Servidor(elUsuario:ClabServer.Usuario, sala:Number) { fl.remoting.debug.NetDebug.initialize(); room = sala; cargandoMsg = false; cargandoLst = false; onMensaje = onEntrada = onSalida = onObjeto = onLista = onLag = null; lastStamp = "0"; lastLagMsg = 0; cLagMsg = 0; conectados = 1; this.user = elUsuario; mensajes = new Array(); usuarios = new Array(); //CODIGO DE 1r MENSAJE //CODIGO DE PARAMETRIZACIÓN DE INTERVALOS //CODIGO DE LANZAMIENTO DE RECIBIMIENTO DE MENSAJES (DE LMQLP) //Inicialización de Remoting NetServices.setDefaultGatewayUrl(gatewayURL); conn = NetServices.createGatewayConnection(); //Inserta al usuario en la lista de usuarios del chat this.entrar(); lista(this); hilo = setInterval(recibir,600,this); hiloClean = setInterval(ClabServer.Servidor.clean,10000,this); hiloDesc = setInterval(desconexion,32000,this); recibir(this); } private function callback(tipo:Number, datos) { if (tipo == ClabServer.Servidor.MENSAJE) { if (onMensaje != null) { onMensaje(datos); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de mensajes"); trace("Declarala asignando un nombre de función a la propiedad 'onMensaje' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } if (tipo == ClabServer.Servidor.OBJETO) { if (onObjeto != null) { onObjeto(datos); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de recibo de objetos"); trace("Declarala asignando un nombre de función a la propiedad 'onObjeto' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } if (tipo == ClabServer.Servidor.ENTRADA) { if (onEntrada != null) { onEntrada(datos); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de entrada de usuarios"); trace("Declarala asignando un nombre de función a la propiedad 'onEntrada' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } if (tipo == ClabServer.Servidor.SALIDA) { if (onSalida != null) { onSalida(datos); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de salida de usuarios"); trace("Declarala asignando un nombre de función a la propiedad 'onSalida' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } if (tipo == ClabServer.Servidor.LISTA) { if (onLista != null) { onLista(datos); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de lista"); trace("Declarala asignando un nombre de función a la propiedad 'onLista' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } if (tipo == ClabServer.Servidor.LAG) { if(onLag != null) { onLag(datos); } } if (tipo == ClabServer.Servidor.ERROR) { if (onError != null) { onError(); } else { trace(""); trace(".:: ClabServer ::."); trace("No has declarado aun una función de manejo de errores"); trace("Declarala asignando un nombre de función a la propiedad 'onError' de esta clase"); trace("Para mas información http://www.cristalab.com/"); } } } //Inserta al usuario en la lista de usuarios de una sala private function entrar():Void{ var envio:Object = new Object(); envio.onStatus = this.errorAMF; servSend = conn.getService("ClabServer",envio); servSend.entrar(this.user.ID,this.user.nusuario,this.room); } private function desconexion(ambito){ if(ambito.lastLagMsg == ambito.lagMsg){ ambito.logout(); } ambito.lastLagMsg = ambito.lagMsg; } //FUNCIONES GENERALES //Convierte un XML a un objeto private function XMLToObj(x:XML):Object { var xml:XML = x; var obj:Object = new Object(); for (i in xml.firstChild.attributes) { obj[i] = xml.firstChild.attributes[i]; } return obj; } //Convierte un objeto a un XML private function objToXML(obj:Object):XML { var compose:String; compose = ""; for (var i in obj) { compose += i+'="'+obj[i]+'" '; } return new XML("<clab "+compose+"/>"); } public function logout(){ var envio:Object = new Object(); envio.onStatus = this.errorAMF; servSend = conn.getService("ClabServer",envio); servSend.salir(this.user.ID,this.user.nusuario,this.room); callback(ClabServer.Servidor.ERROR); clearInterval(hilo); clearInterval(hiloClean); clearInterval(hiloDesc); } public function recibir(esto) { esto.getUsuarios(); esto.serv = null; if(esto.cargandoMsg){ trace(" ----------- lag"); esto.cLagMsg++; if(esto.cLagMsg<30){ return; } } esto.cLagMsg = 0; esto.cargandoMsg = true; //LISTENERS DE FLASH REMOTING var respuesta:Object = new Object(); respuesta.padre = esto; respuesta.getMensajes_Result = function(data) { this.padre.cargandoMsg = false; this.padre.lagMsg = getTimer()-this.padre.lagMsg; var rs:RecordSet = data; var record:Object; var cantidad:Number = rs.getLength(); this.padre.lag = this.padre.lagMsg; this.padre.callback(ClabServer.Servidor.LAG, this.padre.lag); if(cantidad>0){ this.padre.mensajes = null; this.padre.mensajes = new Array(); for(var it=0;it<cantidad;it++){ //Esto hacia que no recibiera los primeros mensajes if(this.padre.lastStamp=="0"){ continue; } record = rs.getItemAt(it); if(record.IDUsuario == -1){ record.Nick = record.nick; } record.Mensaje= unescape(record.Mensaje); if(record.Tipo==ClabServer.Servidor.OBJETO){ record.Mensaje = this.padre.XMLToObj(new XML(record.Mensaje)); } this.padre.mensajes.push(record); } this.padre.lastStamp = rs.getItemAt(0).TimePrint + ""; if(this.padre.mensajes.length){ for (var i in this.padre.mensajes) { this.padre.callback(parseInt(this.padre.mensajes[i].Tipo), this.padre.mensajes[i]); } } } }; respuesta.onStatus = this.errorAMF; //CODIGO DE FLASH REMOTING esto.serv = esto.conn.getService("ClabServer", respuesta); esto.serv.getMensajes(esto.user.ID,esto.user.nusuario,esto.lastStamp,esto.room); esto.lagMsg=getTimer(); } public function lista(esto){ esto.servList = null; if(esto.cargandoLst){ trace(" ----------- lag"); return; } esto.cargandoLst = true; //LISTENERS var respuesta:Object = new Object(); respuesta.padre=esto; respuesta.getUsuarios_Result= function(data) { this.padre.cargandoLst = false; this.padre.lagLst = getTimer()-this.padre.lagLst; trace("Lista: "+this.padre.lagLst); var rs:RecordSet = data; this.padre.usuarios = new Array(); var cantidad:Number = rs.getLength(); for(var it=0;it<cantidad;it++){ this.padre.usuarios[it] = new Object(); this.padre.usuarios[it].ID = rs.getItemAt(it).IDUsuario; if(this.padre.usuarios[it][0]>-1){ this.padre.usuarios[it].Nick = rs.getItemAt(it).Nick; } else { this.padre.usuarios[it].Nick = rs.getItemAt(it).nick; } trace(">>>>>>"+this.padre.usuarios[it].Nick); } this.padre.callback(ClabServer.Servidor.LISTA, this.padre.usuarios); } respuesta.onStatus = this.errorAMF; respuesta.onStatus = this.errorAMF; //CODIGO DE FLASH REMOTING esto.servList = esto.conn.getService("ClabServer", respuesta); esto.servList.getUsuarios(esto.room); esto.lagLst=getTimer(); trace(" Loading Lista"); } //Rapidamente detecta y asigna la cantidad de usuarios en linea a una variable publica private function getUsuarios():Void{ var respuesta:Object = new Object(); respuesta.padre = this; respuesta.onStatus = this.errorAMF; respuesta.getConectados_Result = function(data){ this.padre.conectados = data; } servConec = conn.getService("ClabServer",respuesta); servConec.getConectados(); } public function enviar(mensaje:String) { trace("Enviando "+mensaje); var envio:Object = new Object(); envio.onStatus = this.errorAMF; servSend = conn.getService("ClabServer",envio); servSend.enviar(ClabServer.Servidor.TEXTO,escape(mensaje),user.ID,room,user.nusuario); } public function enviarObj(obj:Object){ trace("CS: Enviando Objeto"); var envio:Object = new Object(); var objXML:XML = objToXML(obj); envio.onStatus = this.errorAMF; servSend = conn.getService("ClabServer",envio); servSend.enviar(Servidor.OBJETO,escape(String(objXML)),user.ID,room,user.nusuario); } //FUNCIÓN ESTATICA DE LIMPIADO DE "NICKS" EN EL SERVIDOR public static function clean(esto){ trace("\t\tLimpiando"); var envio:Object = new Object(); envio.onStatus = esto.errorAMF; esto.servSend = esto.conn.getService("ClabServer",envio); esto.servSend.clean(); } }
Lo cambie porque me tiraba un error de que no se podia encontrar un paquete.Aqui lo que decia:
"No se ha encontrado ninguna clase o paquete con el nombre 'mx.remoting.debug' en el paquete 'mx.remoting'."
Lo cambie pensando que como usaba flex no tenia que ir mx (Espero que no haya hecho cagadas )
Y despues de cambiarlo no me tiraba mas error pero pasa lo que dije anteriormente, me queda en cargando
Espero que me puedan ayudar!