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
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!
