示例:构建 Telnet 客户端

Telnet 示例说明了使用 Socket 类连接远程服务器和传输数据的方法。该示例演示下列方法:

要获取该范例的应用程序文件,请访问 www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/Telnet 文件夹中找到 Telnet 应用程序文件。该应用程序包含以下文件:

文件

描述

TelnetSocket.mxml

包含 MXML 用户界面的主应用程序文件。

com/example/programmingas3/Telnet/Telnet.as

为应用程序提供 Telnet 客户端功能,例如连接到远程服务器以及发送、接收和显示数据。

子主题

Telnet 套接字应用程序概述
Telnet 类概述
向套接字写入数据
显示来自套接字服务器的消息
滚动 TextArea 组件

Telnet 套接字应用程序概述

主 TelnetSocket.mxml 文件负责为整个应用程序创建用户界面 (UI)。

除了 UI,此文件还定义两个方法 login()sendCommand(),以便将用户连接到指定的服务器。

下面的代码列出了主应用程序文件中的 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 = "";
}

第一行代码从自定义 com.example.programmingas.socket 包中导入 Telnet 类。第二行代码声明 Telnet 类的实例 telnetClient,稍后 connect() 方法将初始化该实例。接下来,声明 connect() 方法,该方法初始化先前声明的 telnetClient 变量。此方法传递用户指定的 telnet 服务器名称、telnet 服务器端口和对显示列表中 TextArea 组件的引用,其中,显示列表用于显示来自套接字服务器的文本响应。connect() 方法的最后两行设置 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 包含要连接到的用户指定的服务器地址。

第二个变量 portNumber 是 Telnet 服务器当前在其上运行的端口号。默认情况下,Telnet 服务在端口 23 上运行。

第三个变量 socket 是 Socket 实例,它将尝试连接到由 serverURLportNumber 变量所定义的服务器。

第四个变量 ta 是对舞台上的 TextArea 组件实例的引用。此组件用于显示来自远程 Telnet 服务器的响应或者任何可能的错误消息。

最后一个变量 state 是数值,用于确定 Telnet 客户端支持哪些选项。

正如您之前所见,Telnet 类的构造函数由主应用程序文件中的 connect() 方法调用。

Telnet 构造函数采用三个参数:serverportoutputserverport 参数指定 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() 方法包含一行 ActionScript,用于垂直滚动 TextArea 组件内容,以便用户可以查看返回文本的最后一行。下面的片断显示了 setScroll() 方法:

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

此方法设置 verticalScrollPosition 属性(该属性是当前显示的最上面一行字符的行号),并将其设置为 maxVerticalScrollPosition 属性的值。


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000321.html