Adobe Flex 3 ヘルプ

例:Telnet クライアントの構築

この Telnet の例では、Socket クラスを使用してリモートサーバーに接続し、データを伝送する手法を示します。この例では、次の手法を示します。

  • Socket クラスを使用したカスタム Telnet クライアントの作成
  • ByteArray オブジェクトを使用したリモートサーバーへのテキストの送信
  • リモートサーバーから受信したデータの処理

このサンプルのアプリケーションファイルを入手するには、www.adobe.com/go/learn_programmingAS3samples_flash を参照してください。Telnet アプリケーションのファイルは、Samples/Telnet フォルダにあります。アプリケーションは、次のファイルで構成されています。

ファイル

説明

TelnetSocket.mxml

MXML ユーザーインターフェイスからなるメインアプリケーションファイル。

com/example/programmingas3/Telnet/Telnet.as

リモートサーバーへの接続、データの送受信と表示など、アプリケーションに Telnet クライアント機能を提供します。

サブトピック



Telnet ソケットアプリケーションの概要

メイン TelnetSocket.mxml ファイルは、アプリケーション全体で使用するユーザーインターフェイス(UI)の作成に責任を負います。

このファイルは、UI のほかに、ユーザーを指定されたサーバーに接続するために、login()sendCommand() の 2 つのメソッドも定義しています。

次のコードは、メインアプリケーションファイル内の ActionScript を示しています。

import com.example.programmingas3.socket.Telnet;

private var telnetClient:Telnet;
private function connect():void
{
    telnetClient = new Telnet(serverName.text, int(portNumber.text), output);
    console.title = "Connecting to " + serverName.text + ":" + portNumber.text;
    console.enabled = true;
}
private function sendCommand():void
{
    var ba:ByteArray = new ByteArray();
    ba.writeMultiByte(command.text + "\n", "UTF-8");
    telnetClient.writeBytesToSocket(ba);
    command.text = "";
}

コードの 1 行目は、Telnet クラスをカスタム com.example.programmingas.socket パッケージからインポートします。コードの 2 行目は、Telnet クラスのインスタンス、telnetClient を宣言します。このインスタンスは、後で connect() メソッドによって初期化されます。次に、connect() メソッドが宣言され、前に宣言された telnetClient 変数を初期化します。このメソッドは、ユーザーが指定した Telnet サーバーの名前とポートを引き渡すほか、ソケットサーバーからのテキスト応答の表示に使用される表示リスト上の TextArea コンポーネントへの参照を引き渡します。connect() メソッドの最後の 2 行は、Panel の title プロパティを設定し、Panel コンポーネントを有効にします。このコンポーネントを使用すると、リモートサーバーへデータを送信できます。メインアプリケーションファイル内の最後のメソッド、sendCommand() は、ユーザーのコマンドを ByteArray オブジェクトとしてリモートサーバーへ送信するために使用されます。

Telnet クラスの概要

Telnet クラスは、リモート Telnet サーバーへの接続と、データの送受信に責任を負います。

Telnet クラスは、次のプライベート変数を宣言します。

private var serverURL:String;
private var portNumber:int;
private var socket:Socket;
private var ta:TextArea;
private var state:int = 0;

最初の変数、serverURL は、ユーザーが指定した接続先サーバーアドレスを格納します。

2 番目の変数、portNumber は、Telnet サーバーが現在稼働しているポートの番号です。デフォルトでは、Telnet サービスはポート 23 上で稼働します。

3 番目の変数、socket は、serverURL 変数と portNumber 変数によって定義されたサーバーへの接続を試みる Socket インスタンスです。

4 番目の変数、ta は、ステージ上の TextArea コンポーネントインスタンスへの参照です。このコンポーネントは、リモート Telnet サーバーからの応答やエラーメッセージを表示するために使用されます。

最後の変数、state は、その Telnet クライアントがどのオプションをサポートするかを決定するために使用される数値です。

前に述べたように、Telnet クラスのコンストラクタ関数は、メインアプリケーションファイル内の connect() メソッドによって呼び出されます。

Telnet コンストラクタは serverport および output の 3 つのパラメータを受け取ります。server パラメータと port パラメータは、Telnet サーバーが稼働しているサーバーの名前とポート番号を指定します。最後のパラメータ、output は、サーバーの出力がユーザーに対して表示されるステージ上の TextArea コンポーネントインスタンスへの参照です。

public function Telnet(server:String, port:int, output:TextArea)
{
    serverURL = server;
    portNumber = port;
    ta = output;
    socket = new Socket();
    socket.addEventListener(Event.CONNECT, connectHandler);
    socket.addEventListener(Event.CLOSE, closeHandler);
    socket.addEventListener(ErrorEvent.ERROR, errorHandler);
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
    Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml");
    try
    {
        msg("Trying to connect to " + serverURL + ":" + portNumber + "\n");
        socket.connect(serverURL, portNumber);
    }
    catch (error:Error)
    {
        msg(error.message + "\n");
        socket.close();
    }
}

ソケットへのデータの書き込み

ソケット接続にデータを書き込むには、Socket クラス内のいずれかの書き込みメソッド(writeBoolean()writeByte()writeBytes()writeDouble() など)を呼び出した後、flush() メソッドで出力バッファ内のデータをフラッシュします。Telnet サーバー内では、データは writeBytes() メソッドを使用してソケット接続へ書き込まれます。このメソッドは、パラメータとしてバイト配列を受け取り、それを出力バッファへ送信します。writeBytesToSocket() メソッドは、次のとおりです。

public function writeBytesToSocket(ba:ByteArray):void
{
    socket.writeBytes(ba);
    socket.flush();
}

このメソッドは、メインアプリケーションファイルの sendCommand() メソッドによって呼び出されます。

ソケットサーバーからのメッセージの表示

ソケットサーバーからメッセージを受け取るか、イベントが発生すると、カスタム msg() メソッドが呼び出されます。このメソッドは、ステージ上の TextArea にストリングを付加し、カスタム setScroll() メソッドを呼び出します。これにより、TextArea コンポーネントは最下部までスクロールします。msg() メソッドは、次のとおりです。

private function msg(value:String):void
{
    ta.text += value;
    setScroll();
}

TextArea コンポーネントの内容を自動的にスクロールしなかった場合、サーバーからの最新の応答を参照するには、テキスト領域にあるスクロールバーを手動でドラッグする必要があります。

TextArea コンポーネントのスクロール

setScroll() メソッドには、TextArea コンポーネントの内容を垂直方向にスクロールする 1 行だけの ActionScript が入っており、これにより、ユーザーは返されたテキストの最後の行を見ることができます。次のコードは、setScroll() メソッドを示しています。

public function setScroll():void
{
    ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
}

このメソッドは、現在表示されている文字の一番上の行の行番号を示す verticalScrollPosition プロパティを設定し、そのプロパティを maxVerticalScrollPosition プロパティの値に設定します。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート