Documentazione di Flash CS3 |
|||
| Programmazione in ActionScript 3.0 > Connettività di rete e comunicazioni > 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).
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. |
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:
XMLSocket.connect() può effettuare una connessione solo alle porte con numeri superiori o uguali a 1024. Una conseguenza di questa limitazione consiste nel fatto che anche i daemon dei server che comunicano con l'oggetto XMLSocket devono essere assegnati a numeri di porta superiori o uguali a 1024. I numeri di porta inferiori a 1024 vengono spesso utilizzati dai servizi di sistema come FTP (21), Telnet (23), SMTP (25), HTTP (80) e POP3 (110) e pertanto gli oggetti XMLSocket sono esclusi da queste porte per motivi di sicurezza. La restrizione dei numeri di porta riduce le possibilità di accesso inappropriato e abuso di queste risorse. XMLSocket.connect() può connettersi solo ai computer dello stesso dominio su cui risiede il file SWF. Questa restrizione non vale per i file SWF in esecuzione su un disco locale. (Questa restrizione è identica alle regole di sicurezza per URLLoader.load()). Per connettersi a un daemon di un server in esecuzione su un dominio diverso da quello su cui risiede il file SWF, è possibile creare un file di criteri di sicurezza sul server che consenta l'accesso da alcuni domini specifici.|
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:
XMLSocket.close() della classe XMLSocket.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 |
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 ( |
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