Flash CS3-Dokumentation |
|||
| Programmieren mit ActionScript 3.0 > Netzwerk und Kommunikation > Socketverbindungen | |||
In ActionScript 3.0 sind zwei Arten von Socketverbindungen möglich: XML-Socketverbindungen und binäre Socketverbindungen. Ein XML-Socket ermöglicht Ihnen das Herstellen einer Verbindung mit einem Remote-Server und das Herstellen einer Serververbindung, die solange geöffnet bleibt, bis sie explizit geschlossen wird. Auf diese Weise können Sie XML-Daten zwischen einem Server und einem Client austauschen, ohne dass ständig neue Serververbindungen geöffnet werden müssen. Ein weiterer Vorteil der Verwendung eines XML-Socketservers besteht darin, dass der Benutzer keine Daten explizit anfordern muss. Sie können Daten ohne Anforderungen vom Server senden, und Sie können Daten an jeden Client senden, der eine Verbindung mit dem XML-Socketserver hergestellt hat.
Eine binäre Socketverbindung ähnelt einem XML-Socket, außer dass Client und Server nicht ausschließlich XML-Pakete austauschen müssen. Stattdessen kann die Verbindung Daten als binäre Informationen übertragen. Dadurch können Verbindungen mit einer Vielzahl von Diensten hergestellt werden, einschließlich Mailserver (POP3, SMTP und IMAP) und News-Server (NNTP).
Die neu mit ActionScript 3.0 eingeführte Socket-Klasse ermöglicht das Herstellen von Socketverbindungen sowie das Lesen und Schreiben von unformatierten Binärdaten. Sie ist vergleichbar mit der XMLSocket-Klasse, schreibt jedoch das Format der empfangenen oder übertragenen Daten nicht vor. Die Socket-Klasse eignet sich gut für die Verwendung mit Servern, die Binärprotokolle verwenden. Durch die Verwendung von binären Socketverbindungen können Sie Code schreiben, der die Interaktionen mit mehreren verschiedenen Internetprotokollen wie POP3, SMTP, IMAP und NNTP ermöglicht. Dadurch kann in Flash Player wiederum eine Verbindung mit Mail- und News-Servern hergestellt werden.
Flash Player kann bei der Datenübertragung mit einem Server direkt das Binärprotokoll dieses Servers verwenden. Einige Server verwenden die Bytereihenfolge „bigEndian", andere die Bytereihenfolge „littleEndian". Die meisten Server im Internet verwenden die Bytereihenfolge „bigEndian", da dies der Bytereihenfolge in Netzwerken entspricht. Die Bytereihenfolge „littleEndian" ist verbreitet, da sie in der Intel® x86-Prozessorarchitektur verwendet wird. Verwenden Sie die Endian-Bytereihenfolge, die der Bytereihenfolge des Servers entspricht, der die Daten sendet oder empfängt. Alle Vorgänge, die von den Schnittstellen IDataInput und IDataOutput ausgeführt werden, und die Klassen, die diese Schnittstellen implementieren (ByteArray, Socket und URLStream), liegen standardmäßig im Format „bigEndian" vor, dabei steht das höchstwertige Byte an erster Stelle. Dies erfolgt, um der Java- und der offiziellen Netzwerk-Bytereihenfolge zu entsprechen. Um von der „bigEndian"- zur „littleEndian"-Bytereihenfolge oder umgekehrt zu wechseln, stellen Sie die endian-Eigenschaft auf Endian.BIG_ENDIAN oder Endian.LITTLE_ENDIAN ein.
|
TIPP |
|
Die Socket-Klasse erbt alle Methoden, die von den Schnittstellen IDataInput und IDataOutput implementiert werden (diese Schnittstellen befinden sich im flash.utils-Paket). Diese Methoden sollten für alle socketbezogenen Schreib- und Lesevorgänge verwendet werden. |
In ActionScript gibt es eine vordefinierte XMLSocket-Klasse, über die Sie eine ständige Verbindung mit einem Server herstellen können. Offene Verbindungen sorgen dafür, dass keine Latenzprobleme auftreten, und werden deshalb in der Regel für Echtzeitanwendungen wie Chats oder Multiplayerspiele genutzt. Eine herkömmliche HTTP-Chat-Lösung fragt den Server in kurzen Abständen ab und lädt neue Nachrichten mithilfe einer HTTP-Anforderung. Im Gegensatz dazu unterhält eine XMLSocket-basierte Chat-Lösung eine offene Verbindung mit dem Server, damit dieser neu eingegangene Nachrichten sofort und ohne Anforderung vom Client senden kann.
Um eine Socketverbindung herzustellen, müssen Sie eine serverseitige Anwendung erstellen, die auf die Socketverbindungsanforderung wartet und eine Antwort an die SWF-Datei sendet. Sie können diese serverseitige Anwendung in einer Programmiersprache wie Java, Python oder Perl schreiben. Um die XMLSocket-Klasse verwenden zu können, muss auf dem Servercomputer ein Daemon ausgeführt werden, der das von der XMLSocket-Klasse verwendete Protokoll verarbeiten kann. Das Protokoll wird in der folgenden Liste beschrieben:
|
HINWEIS |
|
Die XMLSocket-Klasse kann nicht automatisch einen Tunnel durch Firewalls öffnen, da XMLSocket im Gegensatz zum RTMP-Protokoll (Real-Time Messaging Protocol) nicht über HTTP-Tunnelfähigkeiten verfügt. Wenn Sie HTTP-Tunneling verwenden müssen, sollten Sie die Verwendung von Flash Remoting oder Flash Mail Server in Betracht ziehen, da diese RTMP unterstützen. |
Folgende Einschränkungen gelten für die Herstellung einer Verbindung zwischen einem XMLSocket-Objekt und dem Server:
XMLSocket.connect() kann nur Verbindungen zu TCP-Anschlussnummern herstellen, die größer oder gleich 1024 sind. Als Folge dieser Einschränkung müssen den Serverdaemons, die mit dem XMLSocket-Objekt kommunizieren, ebenfalls Anschlussnummern zugeordnet sein, die größer oder gleich 1024 sind. Anschlussnummern unter 1024 werden häufig von Systemdiensten wie FTP (21), Telnet (23), SMTP (25), HTTP (80) und POP3 (110) verwendet; die Verwendung dieser Anschlüsse durch XMLSocket-Objekte ist aus Sicherheitsgründen nicht zulässig. Durch Einschränkung der verfügbaren Anschlussnummern lässt sich das Risiko verringern, dass in ungeeigneter oder missbräuchlicher Weise auf diese Ressourcen zugegriffen wird. XMLSocket.connect() können nur Verbindungen zu Computern hergestellt werden, die sich in der gleichen Domäne wie die SWF-Datei befinden. Diese Einschränkung gilt nicht für SWF-Dateien, die von einem lokalen Datenträger aus wiedergegeben werden. (Diese Einschränkung ist mit den Sicherheitsregeln für URLLoader.load() identisch.) Wenn Sie eine Verbindung mit einem Serverdaemon herstellen möchten, der sich in einer anderen Domäne als die der SWF-Datei befindet, können Sie eine Sicherheitsrichtliniendatei auf dem Server erstellen, die den Zugriff aus bestimmten Domänen erlaubt.|
HINWEIS |
|
Das Einrichten eines Servers zur Kommunikation mit einem XMLSocket-Objekt ist oft recht anspruchsvoll. Wenn Ihre Anwendung keine Interaktionen in Echtzeit erfordert, verwenden Sie die URLLoader-Klasse anstelle der XMLSocket-Klasse. |
Mit den Methoden XMLSocket.connect() und XMLSocket.send() der XMLSocket-Klasse können Sie XML-Daten über eine Socketverbindung mit einem Server austauschen. Mit der Methode XMLSocket.connect() stellen Sie eine Socketverbindung mit einem Webserver-Anschluss her. Mit der Methode XMLSocket.send() übergeben Sie ein XML-Objekt an den in der Socketverbindung festgelegten Server.
Sobald Sie die Methode XMLSocket.connect() aufrufen, öffnet Flash Player eine TCP/IP-Verbindung mit dem Server und erhält diese Verbindung aufrecht, bis eine der folgenden Bedingungen eintritt:
XMLSocket.close()-Methode der XMLSocket-Klasse wird aufgerufen.Der folgende Code zeigt, wie ein einfacher XMLSocket-Server in Java geschrieben wird, der ankommende Verbindungen akzeptiert und die empfangenen Nachrichten in einem Fenster mit Eingabeaufforderung anzeigt. In der Standardeinstellung wird ein neuer Server am Anschluss 8080 Ihres lokalen Computers erstellt. Sie können jedoch beim Starten Ihres Servers von der Befehlszeile auch eine andere Anschlussnummer angeben.
Erstellen Sie ein neues Textdokument und geben Sie den folgenden Code ein:
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)
{
// Ausnahme abfangen und fortsetzen.
}
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);
}
}
Speichern Sie das Dokument als „SimpleServer.java" auf Ihrer Festplatte und kompilieren Sie es mithilfe eines Java-Compilers, der eine Java-Klassendatei namens „SimpleServer.class" erstellt.
Sie können den XMLSocket-Server starten, indem Sie eine Eingabeaufforderung öffnen und java SimpleServer eingeben. Die Datei „SimpleServer.class" kann sich in einem beliebigen Verzeichnis auf Ihrem lokalen Computer oder im Netzwerk befinden; sie muss nicht im Hauptverzeichnis Ihres Webservers abgelegt sein.
|
TIPP |
|
Wenn Sie den Server nicht starten können, da sich die Dateien nicht im Java-Klassenpfad befinden, versuchen Sie, den Server mit |
Um aus der ActionScript-Anwendung eine Verbindung mit der XMLSocket-Klasse herzustellen, müssen Sie eine neue Instanz der XMLSocket-Klasse erstellen und die XMLSocket.connect()-Methode aufrufen, der Sie Hostnamen und Anschlussnummer wie folgt übergeben:
var xmlsock:XMLSocket = new XMLSocket();
xmlsock.connect("127.0.0.1", 8080);
Wenn ein Aufruf von XMLSocket.connect() zum Herstellen einer Verbindung mit einem Server außerhalb der Sicherheits-Sandbox des aufrufenden Objekts oder auf einem Anschluss unter 1024 erfolgt, tritt ein securityError-Ereignis ein (flash.events.SecurityErrorEvent).
Jedes Mal, wenn Sie Daten vom Server empfangen, wird das Data-Ereignis (flash.events.DataEvent.DATA) ausgelöst:
xmlsock.addEventListener(DataEvent.DATA, onData);
private function onData(event:DataEvent):void
{
trace("[" + event.type + "] " + event.data);
}
Zum Senden von Daten an den XMLSocket-Server verwenden Sie die XMLSocket.send()-Methode und übergeben ein XML-Objekt oder einen String. Flash Player wandelt den angegebenen Parameter in ein String-Objekt um und sendet den Inhalt an den XMLSocket-Server, gefolgt von einem Null (0)-Byte:
xmlsock.send(xmlFormattedData);
Die Methode XMLSocket.send() gibt keinen Wert zurück, der angibt, ob die Daten erfolgreich übermittelt wurden. Tritt bei dem Versuch, die Daten zu senden, ein Fehler auf, wird ein IOError-Fehler ausgelöst.
|
TIPP |
|
Jede Nachricht, die Sie an den XML-Socketserver senden, muss durch das newline-Zeichen ( |
Flash CS3
Eine E-Mail an mich senden, wenn dieser Seite Kommentare hinzugefügt werden | Kommentarbericht
Aktuelle Seite: http://livedocs.adobe.com/flash/9.0_de/main/00000318.html