Connessioni socket

In ActionScript 3.0 sono disponibili due diversi tipi di connessioni socket: connessioni socket XML e connessioni socket binarie. Un socket XML consente di connettersi a un server remoto e di creare una connessione al server che rimane aperta finché non viene chiusa in modo esplicito. In questo modo è possibile scambiare dati XML tra un server e un client senza dover aprire continuamente nuove connessioni al server. Un ulteriore vantaggio legato all'uso di un server socket XML è rappresentato dal fatto che l'utente non deve richiedere esplicitamente i dati. È possibile inviare dati dal server senza richieste e a tutti i client connessi al server socket XML.

Una connessione socket binaria è simile a un socket XML, ma il client e il server non devono necessariamente scambiare pacchetti XML specifici. Al contrario, sulla connessione possono essere trasferiti dati come informazioni binarie. In questo modo è possibile connettersi a una vasta gamma di servizi, compresi i server di posta (POP3, SMTP e IMAP) e i server delle news (NNTP).

Sezioni

Classe Socket
Classe XMLSocket
Creazione e connessione a un server socket XML Java

Classe Socket

Introdotta in ActionScript 3.0, la classe Socket consente di effettuare connessioni socket e di leggere e scrivere dati binari originari da ActionScript. È simile alla classe XMLSocket ma non impone il formato dei dati ricevuti e trasmessi. La classe Socket è utile per interagire con i server che utilizzano protocolli binari. Utilizzando le connessioni socket binarie è possibile scrivere codice che consenta l'interazione con più protocolli Internet diversi, ad esempio POP3, SMTP, IMAP e NNTP. Ciò consente a Flash Player di connettersi a propria volta ai server di posta e delle news.

Flash Player è in grado di interfacciarsi con un server utilizzando direttamente il protocollo binario di quel server. Alcuni server utilizzano l'ordine dei byte bigEndian e altri littleEndian. La maggior parte dei server in Internet utilizza l'ordine dei byte bigEndian perché questo è "l'ordine dei byte di rete". L'ordine dei byte littleEndian è conosciuto in quanto utilizzato dall'architettura Intel® x86. È necessario utilizzare l'ordine dei byte Endian corrispondente a quello del server che invia o riceve i dati. Tutte le operazioni eseguite dalle interfacce IDataInput e IDataOutput e le classi che implementano tali interfacce (ByteArray, Socket e URLStream) sono codificate per impostazione predefinita nel formato bigEndian, ovvero con il byte più significativo all'inizio. Ciò avviene ai fini della corrispondenza dell'ordine dei byte di rete ufficiale e Java. Per scegliere di utilizzare l'ordine dei byte bigEndian o littleEndian, è possibile impostare la proprietà endian su Endian.BIG_ENDIAN o Endian.LITTLE_ENDIAN.

SUGGERIMENTO

 

La classe Socket eredita tutti i metodi implementati dalle interfacce IDataInput e IDataOutput (incluse nel pacchetto flash.utils) e per scrivere e leggere da Socket dovranno essere utilizzati questi metodi.

Classe XMLSocket

ActionScript fornisce una classe XMLSocket incorporata che consente di stabilire una connessione continua con un server. La connessione aperta evita problemi di latenza e viene in genere utilizzata per applicazioni in tempo reale, ad esempio per le applicazioni chat o i giochi in modalità multiplayer. Una normale soluzione chat basata su HTTP esegue il polling del server e scarica i nuovi messaggi mediante una richiesta HTTP. Al contrario, una soluzione chat basata su XMLSocket mantiene una connessione aperta con il server, che consente a quest'ultimo di inviare immediatamente i messaggi in entrata senza che il client emetta una richiesta.

Per creare una connessione socket, è necessario creare un'applicazione sul lato server che attenda la richiesta della connessione socket e invii la risposta al file SWF. Questo tipo di applicazione sul lato server può essere scritta in un linguaggio di programmazione come Java, Python o Perl. Per utilizzare la classe XMLSocket, sul server deve essere in esecuzione un daemon in grado interpretare il protocollo utilizzato dalla classe XMLSocket. Il protocollo viene descritto nell'elenco seguente:

NOTA

 

La classe XMLSocket non può eseguire il tunneling automatico attraverso i firewall perché, a differenza del protocollo RTMP (Real-Time Messaging Protocol), XMLSocket non dispone di capacità di tunneling HTTP. Se è necessario il tunneling HTTP, valutare la possibilità di utilizzare Flash Remoting o Flash Media Server (che supporta RTMP).

Le seguenti limitazioni riguardano le modalità di connessione al server da parte di un oggetto XMLSocket:

NOTA

 

La procedura di configurazione di un server per la comunicazione con l'oggetto XMLSocket può rivelarsi un'operazione complessa. Se l'applicazione in uso non richiede l'interattività in tempo reale, utilizzare la classe URLLoader anziché la classe XMLSocket.

Per trasferire il codice XML verso e dal server su una connessione socket, è possibile utilizzare i metodi XMLSocket.connect() e XMLSocket.send() della classe XMLSocket. Il metodo XMLSocket.connect() stabilisce una connessione socket con una porta di un server Web. Il metodo XMLSocket.send() passa un oggetto XML al server specificato nella connessione socket.

Quando si richiama il metodo XMLSocket.connect(), Flash Player apre una connessione TCP/IP al server e la mantiene aperta fino al verificarsi di uno dei seguenti eventi:

Creazione e connessione a un server socket XML Java

Il codice riportato di seguito dimostra un semplice server XMLSocket scritto in Java che accetta le connessioni in entrata e visualizza i messaggi ricevuti nella finestra del prompt dei comandi. Per impostazione predefinita, viene creato un nuovo server sulla porta 8080 del computer locale, anche se è possibile specificare un numero di porta diverso quando si avvia il server dalla riga di comando.

Creare un nuovo documento di testo e aggiungere il codice riportato di seguito:

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)
        {
            // Rileva l'eccezione e continua.
        }

        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);
    }
}

Salvare il documento sul disco rigido come SimpleServer.java e compilarlo con un compilatore Java, che crea un file di classe Java di nome SimpleServer.class.

È possibile avviare il server XMLSocket aprendo un prompt dei comandi e digitando java SimpleServer. Il file SimpleServer.class può trovarsi in qualsiasi percorso del computer locale o della rete; non è necessario collocarlo nella directory principale del server Web.

SUGGERIMENTO

 

Se non è possibile avviare il server perché i file non si trovano nel percorso di classe Java, provare ad avviarlo con java -classpath . SimpleServer.

Per connettersi a XMLSocket dall'applicazione ActionScript, è necessario creare una nuova istanza della classe XMLSocket e chiamare il metodo XMLSocket.connect() mentre vengono passati un nome host e un numero di porta, come riportato di seguito:

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

Si verifica un evento securityError (flash.events.SecurityErrorEvent) se una chiamata a XMLSocket.connect() tenta di connettersi a un server che si trova al di fuori della funzione di sicurezza sandbox del chiamante o a una porta con numero inferiore a 1024.

Quando si ricevono dati dal server, viene inviato l'evento data (flash.events.DataEvent.DATA):

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

Per inviare dati al server XMLSocket, utilizzare il metodo XMLSocket.send() e passare una stringa o un oggetto XML. Flash Player converte il parametro fornito in un oggetto String e invia il contenuto al server XMLSocket seguito da un byte zero (0):

xmlsock.send(xmlFormattedData);

Il metodo XMLSocket.send() non restituisce un valore che indica se i dati sono stati trasmessi correttamente. Se si è verificato un errore mentre si tenta di inviare i dati, viene generato un errore IOError.

SUGGERIMENTO

 

Ogni messaggio inviato al server socket XML deve essere terminato da un carattere newline (\n).


Flash CS3

 

Inviami un messaggio e-mail quando vengono aggiunti dei commenti a questa | Rapporto sui commenti

Pagina corrente: http://livedocs.adobe.com/flash/9.0_it/main/00000318.html