Flash CS3 ドキュメンテーション |
|||
| ActionScript 3.0 のプログラミング > ネットワーキングとコミュニケーション > ソケットの接続 | |||
ActionScript 3.0 で可能なソケットの接続には、XML ソケット接続とバイナリソケット接続の 2 種類があります。XML ソケットでリモートサーバーに接続する場合は、明示的に接続を閉じるまで維持されるサーバー接続を確立できます。これにより、サーバー接続を確立し直す処理を繰り返すことなくサーバー/クライアント間で XML データの交換を継続できます。XML ソケットサーバーを使用するもう 1 つのメリットは、ユーザーが明示的にデータを要求する必要がないことです。要求がなくてもサーバーからのデータ送信ができ、また、XML ソケットサーバーに接続済みのクライアントすべてに対してデータを送信できます。
バイナリソケット接続は、XML ソケットに似ていますが、クライアント/サーバー間で交換するデータが XML パケットである必要はないという点が異なります。データはバイナリ情報として伝送されます。このため、電子メールサーバー (POP3、SMTP、IMAP) やニュースサーバー (NNTP) などさまざまなサービスとの接続に使用できます。
ActionScript 3.0 で新設された Socket クラスを使用すると、ActionScript でソケット接続を確立して生のバイナリデータを読み書きできます。これは XMLSocket クラスに似ていますが、送受信するデータの形式に制約がありません。Socket クラスは、バイナリプロトコルを使用するサーバーとの通信に役立ちます。バイナリソケット接続を使用すれば、POP3、SMTP、IMAP、NNTP などさまざまなインターネットプロトコルによる通信のコードを記述できます。したがって、Flash Player から電子メールサーバーやニュースサーバーに接続することもできます。
Flash Player からサーバーに直接接続するには、サーバーが使用するバイナリプロトコルに従う必要があります。バイト順序にビッグエンディアンを使用するサーバーと、リトルエンディアンを使用するサーバーがあります。標準の "ネットワークバイト順序" がビッグエンディアンとされているため、インターネット上の大部分のサーバーはビッグエンディアンのバイト順序を使用しています。また、Intel x86 アーキテクチャでリトルエンディアンが採用されているため、リトルエンディアンのバイト順序が使用されることもよくあります。データを送受信する対象のサーバーに適したエンディアンバイト順序を使用してください。IDataInput および IDataOutput インターフェイスで実行されるすべての操作と、これらのインターフェイスを実装するクラス (ByteArray、Socket、URLStream) では、デフォルトでビッグエンディアン形式 (先頭が最上位バイト) を使用します。これは、Java および公式なネットワークバイト順序に適合するためです。使用するエンディアンを変更する場合は、endian プロパティに Endian.BIG_ENDIAN または Endian.LITTLE_ENDIAN を設定します。
|
ヒント |
|
Socket クラスでは、IDataInput および IDataOutput インターフェイス (flash.utils パッケージ) で実装するすべてのメソッドを継承しています。Socket の読み書きにはそれらのメソッドを使用してください。 |
ActionScript には、サーバーとの連続的な接続を確立できる XMLSocket ビルトインクラスがあります。接続が維持されるため待ち時間の問題が解消されるので、チャットやマルチプレーヤーゲームなどのリアルタイムアプリケーションによく使用されます。従来の HTTP ベースによるチャットソリューションでは、サーバーへのポーリング処理を頻繁に実行し、HTTP リクエストを使用して新しいメッセージをダウンロードします。それに対し、XMLSocket によるチャットソリューションではサーバーとの接続を開いたまま維持するため、クライアントから要求されなくても、新着メッセージをサーバーから直ちに送信できます。
ソケット接続を確立するには、ソケット接続の要求を受け付けて SWF ファイルに応答を送るサーバーサイドアプリケーションを作成する必要があります。このようなサーバーサイドアプリケーションは、Java、Python、Perl などのプログラミング言語で作成できます。XMLSocket クラスを使用するには、サーバーコンピュータで動作するデーモンが XMLSocket クラスで使用するプロトコルを処理できる必要があります。プロトコルの説明を次の一覧に示します。
|
メモ |
|
XMLSocket クラスは、ファイアウォールをトンネリングによって自動的に通過することはできません。RTMP プロトコルとは異なり、XMLSocket には HTTP トンネリング機能が備わっていないためです。HTTP トンネリングが必要な場合は、Flash Remoting または (RTMP をサポートする) Flash Media Server の使用をお勧めします。 |
XMLSocket オブジェクトがサーバーに接続する方法と接続先については、次の制限があります。
XMLSocket.connect() メソッドが接続できる TCP ポートの番号は、1024 以上です。この制限により、XMLSocket オブジェクトと通信するサーバーデーモンにも、1024 以上のポート番号を割り当てる必要があります。1024 未満のポート番号は、FTP (21)、Telnet (23)、SMTP (25)、HTTP (80)、POP3 (110) などのシステムサービスによって使用されることが多いため、セキュリティ上の理由から、XMLSocket オブジェクトではこれらのポートにアクセスできません。こうしたリソースが不適切な方法でアクセスされたり悪用されたりする可能性を小さくするために、ポート番号が制限されています。 XMLSocket.connect メソッドは、SWF ファイルが存在するのと同じドメイン内のコンピュータにしか接続できません。この制限は、ローカルディスクから再生される SWF ファイルには適用されません (この制限は、URLLoader.load() のセキュリティ規則と同じです)。特定のドメインからのアクセスを許可するセキュリティポリシーファイルを作成すると、SWF ファイルが存在するドメイン以外で実行されるサーバーデーモンに接続できます。|
メモ |
|
XMLSocket オブジェクトと通信できるようにサーバーを設定することは、場合によっては困難が伴います。リアルタイムのインタラクティブ機能を必要としないアプリケーションでは、XMLSocket クラスではなく URLLoader クラスを使用してください。 |
XMLSocket クラスの XMLSocket.connect() メソッドと XMLSocket.send() メソッドを使用し、ソケット接続を介してサーバーへ XML を送信 (またはサーバーから受信) することができます。XMLSocket.connect() メソッドは、Web サーバーのポートに対してソケット接続を確立します。XMLSocket.send() メソッドは、ソケット接続で指定されたサーバーに XML オブジェクトを送信します。
XMLSocket.connect() メソッドを呼び出すと、Flash Player によってサーバーへの TCP/IP 接続が開かれ、次のいずれかのイベントが発生するまでその接続が開いたまま維持されます。
XMLSocket.close() メソッドが呼び出される。次のコードは、Java で作成した単純な XMLSocket サーバーの例です。接続を受け付け、受信したメッセージをコマンドプロンプトウィンドウに表示します。デフォルトでは新しいサーバーをローカルマシンのポート番号 8080 に作成しますが、サーバーを起動する際のコマンドラインでポート番号を変更することもできます。
新しいテキストドキュメントを作成し、次のコードを入力します。
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)
{
// 例外をキャッチして続行する
}
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);
}
}
ドキュメントを SimpleServer.java としてハードディスクに保存し、Java コンパイラを使用してこれをコンパイルすると、SimpleServer.class という名前の Java クラスが作成されます。
コマンドプロンプトを開き、java SimpleServer と入力して XMLSocket サーバーを起動します。"SimpleServer.class" ファイルはローカルコンピュータ上またはネットワーク上のどこに配置しても使用できます。Web サーバーのルートディレクトリに置く必要はありません。
|
ヒント |
|
ファイルを置いた場所が Java クラスパスに含まれていないためにサーバーを起動できない場合は、 |
ActionScript アプリケーションから XMLSocket に接続するには、次のように XMLSocket クラスの新しいインスタンスを作成し、ホスト名とポート番号を指定して XMLSocket.connect() メソッドを呼び出します。
var xmlsock:XMLSocket = new XMLSocket();
xmlsock.connect("127.0.0.1", 8080);
XMLSocket.connect() の呼び出しによって、呼び出し元のセキュリティ Sandbox の外部サーバーや 1024 未満のポート番号に接続しようとした場合、securityError (flash.events.SecurityErrorEvent) イベントが発生します。
サーバーからデータを受信するたびに、data イベント (flash.events.DataEvent.DATA) が送出されます。
xmlsock.addEventListener(DataEvent.DATA, onData);
private function onData(event:DataEvent):void
{
trace("[" + event.type + "] " + event.data);
}
XMLSocket サーバーにデータを送信するには、XMLSocket.send() メソッドを使用して XML オブジェクトまたは XML ストリングを渡します。Flash Player によってパラメータが String オブジェクトに変換され、その内容に終端を示すゼロ (0) バイトを付加したデータが XMLSocket サーバーに送信されます。
xmlsock.send(xmlFormattedData);
XMLSocket.send() メソッドは、データが正常に転送されたかどうかを示す値を返しません。データの送信中にエラーが発生した場合は、IOError エラーがスローされます。
|
ヒント |
|
XML ソケットサーバーに送信する個々のメッセージには、末尾に終端の改行文字 ( |
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート
現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000318.html