Conexiones de socket

Hay dos tipos distintos de conexiones de socket que pueden utilizarse en ActionScript 3.0: conexiones de socket XML y conexiones de socket binario. Un socket XML permite conectarse a un servidor remoto y crear una conexión de servidor que permanece abierta hasta que se cierra de forma explícita. Esto permite intercambiar datos XML entre un servidor y un cliente sin tener que abrir continuamente nuevas conexiones de servidor. Otra ventaja de utilizar un servidor de socket XML es que el usuario no tiene que solicitar datos de forma explícita. Se pueden enviar datos desde el servidor, sin necesidad de solicitudes, a cada cliente conectado al servidor de socket XML.

Una conexión de socket binario es similar a un socket XML, pero el cliente y el servidor no necesitan intercambiar paquetes XML específicamente. En lugar de eso, la conexión puede transferir datos como información binaria. Esto permite conectar una amplia gama de servicios, como servidores de correo (POP3, SMTP e IMAP) y servidores de noticias (NNTP).

Subtemas

Clase Socket
Clase XMLSocket
Creación y conexión de un servidor de socket XML de Java

Clase Socket

La clase Socket, introducida en ActionScript 3.0, permite que el código ActionScript realice conexiones de socket, y que lea y escriba datos binarios sin formato. Es similar a la clase XMLSocket, pero no dicta el formato de los datos recibidos y transmitidos. La clase Socket resulta útil para interoperar con servidores que utilicen protocolos binarios. Se pueden utilizar conexiones de socket binario para escribir código que permita la interacción con varios protocolos de Internet distintos, como POP3, SMTP, IMAP y NNTP. Esto, a su vez, permite a Flash Player conectarse a servidores de correos y noticias.

Flash Player puede interactuar con un servidor directamente mediante el protocolo binario de dicho servidor. Algunos servidores utilizan el orden de bytes bigEndian y otros utilizan el orden de bytes littleEndian. La mayoría de los servidores de Internet utilizan el orden de bytes bigEndian, ya que el "orden de bytes de la red" es bigEndian. El orden de bytes littleEndian es popular porque la arquitectura Intel® x86 lo utiliza. Debe utilizarse el orden de bytes Endian que coincida con el orden de bytes del servidor que envía o recibe los datos. Todas las operaciones que se realizan mediante las interfaces IDataInput e IDataOutput, y las clases que implementan dichas interfaces (ByteArray, Socket y URLStream) se codifican de forma predeterminada en formato bigEndian. Esto supone que el byte más significativo va primero. El objetivo es que coincida el orden de bytes de la red oficial con el de Java. Para cambiar entre el uso de orden de bytes bigEndian o littleEndian, se puede establecer la propiedad endian en Endian.BIG_ENDIAN o Endian.LITTLE_ENDIAN.

SUGERENCIA

 

La clase Socket hereda todos los métodos implementados por las interfaces IDataInput e IDataOutput (ubicadas en el paquete flash.utils) y dichos métodos deben utilizarse para escribir y leer en Socket.

Clase XMLSocket

ActionScript proporciona una clase XMLSocket incorporada que permite abrir una conexión continua con un servidor. Esta conexión abierta elimina los problemas de latencia y se usa con frecuencia para las aplicaciones en tiempo real como las aplicaciones de chat o los juegos de varios jugadores. Una solución de chat tradicional basada en HTTP suele sondear el servidor y descargar los mensajes nuevos mediante una solicitud HTTP. Por contra, una solución de chat con XMLSocket mantiene una conexión abierta con el servidor, lo que permite que el servidor envíe de inmediato los mensajes entrantes sin que se produzca una solicitud del cliente.

Para crear una conexión de socket, se debe crear una aplicación de servidor que espere la solicitud de conexión de socket y envíe una respuesta al archivo SWF. Este tipo de aplicación de servidor puede escribirse en un lenguaje de programación como Java, Python o Perl. Para utilizar la clase XMLSocket, el equipo servidor debe ejecutar un demonio que entienda el protocolo utilizado por la clase XMLSocket. El protocolo se describe en la siguiente lista:

NOTA

 

La clase XMLSocket no puede atravesar cortafuegos automáticamente, ya que, a diferencia del protocolo RTMP (Real-Time Messaging Protocol), XMLSocket no dispone de prestaciones de tunelación HTTP. Si es necesario utilizar tunelación HTTP, debe considerarse la posibilidad de utilizar Flash Remoting o Flash Media Server (que admite RTMP).

Las siguientes restricciones afectan a la forma y el lugar en el que el objeto XMLSocket puede conectar con el servidor:

NOTA

 

La configuración de un servidor para que se comunique con el objeto XMLSocket puede resultar compleja. Si la aplicación no requiere interactividad en tiempo real, se debe usar la clase URLLoader en vez de la clase XMLSocket.

Se pueden utilizar los métodos XMLSocket.connect() y XMLSocket.send() de la clase XMLSocket para transferir XML desde y hacia un servidor, a través de una conexión de socket. El método XMLSocket.connect() establece una conexión de socket con un puerto de servidor Web. El método XMLSocket.send() pasa un objeto XML al servidor especificado en la conexión de socket.

Cuando se llama al método XMLSocket.connect(), Flash Player abre una conexión TCP/IP con el servidor y la mantiene abierta hasta que se produce una de las siguientes situaciones:

Creación y conexión de un servidor de socket XML de Java

El siguiente código muestra un sencillo servidor XMLSocket escrito en Java que acepta conexiones entrantes y muestra los mensajes recibidos en la ventana de símbolo del sistema. De forma predeterminada, se crea un nuevo servidor en el puerto 8080 del equipo local, aunque se puede especificar otro número de puerto cuando se inicia el servidor desde la línea de comandos.

Cree un nuevo documento de texto y añada el siguiente código:

import java.io.*;
import java.net.*;

class SimpleServer
{
    private static SimpleServer server;
    ServerSocket socket;
    Socket incoming;
    BufferedReader readerIn;
    PrintStream printOut;

    public static void main(String[] args)
    {
        int port = 8080;

        try
        {
            port = Integer.parseInt(args[0]);
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            // Capturar excepción y continuar.
        }

        server = new SimpleServer(port);
    }

    private SimpleServer(int port)
    {
        System.out.println(">> Starting SimpleServer");
        try
        {
            socket = new ServerSocket(port);
            incoming = socket.accept();
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            printOut = new PrintStream(incoming.getOutputStream());
            printOut.println("Enter EXIT to exit.\r");
            out("Enter EXIT to exit.\r");
            boolean done = false;
            while (!done)
            {
                String str = readerIn.readLine();
                if (str == null)
                {
                    done = true;
                }
                else
                {
                    out("Echo: " + str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
                incoming.close();
            }
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    private void out(String str)
    {
        printOut.println(str);
        System.out.println(str);
    }
}

Guarde el documento en el disco duro como SimpleServer.java y compílelo con la ayuda de un compilador de Java, que crea un archivo de clase de Java denominado SimpleServer.class.

Para iniciar el servidor XMLSocket, abra un símbolo del sistema y escriba java SimpleServer. El archivo SimpleServer.class puede almacenarse en cualquier lugar del equipo local o la red; no es necesario que esté en el directorio raíz del servidor Web.

SUGERENCIA

 

Si no puede iniciar el servidor porque los archivos no se encuentran en la ruta de clases de Java, intente iniciar el servidor con java -classpath . SimpleServer.

Para conectarse a XMLSocket desde la aplicación ActionScript, es necesario crear una nueva instancia de la clase XMLSocket y llamar al método XMLSocket.connect(), pasando un nombre de host y un número de puerto, del siguiente modo:

var xmlsock:XMLSocket = new XMLSocket();
xmlsock.connect("127.0.0.1", 8080);

Se produce un evento securityError (flash.events.SecurityErrorEvent) si, a través de una llamada a XMLSocket.connect(), se intenta conectar con un servidor fuera del entorno limitado de seguridad del que realiza la llamada o con un puerto inferior a 1024.

Cuando se reciben datos del servidor, se distribuye el evento data (flash.events.DataEvent.DATA):

xmlsock.addEventListener(DataEvent.DATA, onData);
private function onData(event:DataEvent):void
{
    trace("[" + event.type + "] " + event.data);
}

Para enviar datos al servidor XMLSocket, se utiliza el método XMLSocket.send() y se pasa una cadena u objeto XML. Flash Player convierte el parámetro suministrado en un objeto String y envía el contenido al servidor XMLSocket, seguido de un byte cero (0):

xmlsock.send(xmlFormattedData);

El método XMLSocket.send() no devuelve ningún valor que indique si los datos se han transmitido correctamente. Si se produce un error al intentar enviar datos, se emite un error IOError.

SUGERENCIA

 

Cada mensaje que se envía al servidor de socket XML debe terminar con un carácter de nueva línea (\n).


Flash CS3

 

Enviarme un mensaje de correo electrónico cuando se añadan comentarios a esta página | Informe de comentarios

Página actual: http://livedocs.adobe.com/flash/9.0_es/main/00000318.html