Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > 网络与通信 > 套接字连接 | |||
在 ActionScript 3.0 中,可以使用两种不同类型的套接字连接:XML 套接字连接和二进制套接字连接。使用 XML 套接字,可以连接到远程服务器并创建服务器连接,该连接在显式关闭之前一直保持打开。这样,无需不断打开新服务器连接,就可以在服务器与客户端之间交换 XML 数据。使用 XML 套接字服务器的另一个好处是用户不需要显式请求数据。您无需请求即可从服务器发送数据,并且可以将数据发送到连接到 XML 套接字服务器的每个客户端。
二进制套接字连接与 XML 套接字类似,不同之处是客户端与服务器不需要专门交换 XML 数据包,连接可以将数据作为二进制信息传输。这样,您就可以连接到各种各样的服务,包括邮件服务器(POP3、SMTP 和 IMAP)和新闻服务器 (NNTP)。
ActionScript 3.0 中引入的 Socket 类使 ActionScript 可以建立套接字连接并读取和写入原始二进制数据。它与 XMLSocket 类相似,但没有指定接收和传输数据的格式。使用二进制协议的服务器互操作时,Socket 类与非常有用。使用二进制套接字连接,可以编写允许用一些不同的 Internet 协议(例如 POP3、SMTP、IMAP 和 NNTP)进行交互的代码。反过来,这又会使 Flash Player 能够连接到邮件和新闻服务器。
Flash Player 可通过使用服务器的二进制协议直接与该服务器连接。某些服务器使用 big-endian 字节顺序,某些服务器则使用 little-endian 字节顺序。Internet 上的大多数服务器使用 big-endian 字节顺序,因为“网络字节顺序”为 big-endian。little-endian 字节顺序很常用,因为 Intel x86® 体系结构使用该字节顺序。您应使用与收发数据的服务器的字节顺序相匹配的 endian 字节顺序。默认情况下,IDataInput 和 IDataOutput 接口执行的所有操作和实现这些接口的类(ByteArray、Socket 和 URLStream)都以 big-endian 格式编码;即,最高有效字节位于前面。这样做是为了匹配 Java 和官方网络字节顺序。要更改是使用 big-endian 还是使用 little-endian 字节顺序,可以将 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 类不能自动穿过防火墙,因为 XMLSocket 没有 HTTP 隧道功能(这与实时消息传递协议 (RTMP) 不同)。如果您需要使用 HTTP 隧道,应考虑改用 Flash Remoting 或 Flash Media Server(支持 RTMP)。 |
XMLSocket 对象连接到服务器的方式和位置受以下限制:
XMLSocket.connect() 方法只能连接到端口号大于或等于 1024 的 TCP 端口。这种限制的一个后果是,与 XMLSocket 对象进行通信的服务器守护程序也必须分配到端口号大于或等于 1024 的端口。端口号小于 1024 的端口通常用于系统服务(如 FTP (21)、Telnet (23)、SMTP (25)、HTTP (80) 和 POP3 (110)),因此,出于安全方面的考虑,禁止 XMLSocket 对象使用这些端口。这种端口号方面的限制可以减少不恰当地访问和滥用这些资源的可能性。 XMLSocket.connect() 方法只能连接到 SWF 文件所在域中的计算机。这一限制不适用于在本地磁盘外运行的 SWF 文件。(此限制与 URLLoader.load() 的安全规则相同。)要连接到在 SWF 所在域之外的其它域中运行的服务器守护程序,可以在该服务器上创建一个允许从特定域进行访问的安全策略文件。|
注意 |
|
将服务器设置为与 XMLSocket 对象进行通信可能会遇到一些困难。如果您的应用程序不需要进行实时交互,请使用 URLLoader 类,而不要使用 XMLSocket 类。 |
可以使用 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 classpath 中而无法启动服务器,请尝试使用 |
要从 ActionScript 应用程序连接到 XMLSocket,需要新建一个 XMLSocket 类实例,并在传递主机名和端口号时调用 XMLSocket.connect() 方法,如下所示:
var xmlsock:XMLSocket = new XMLSocket();
xmlsock.connect("127.0.0.1", 8080);
如果 XMLSocket.connect() 调用尝试连接到调用方安全沙箱以外的服务器,或者连接到低于 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 对象或字符串。Flash Player 将提供的参数转换为 String 对象,并将内容发送到 XMLSocket 服务器(后跟零 (0) 字节):
xmlsock.send(xmlFormattedData);
XMLSocket.send() 方法不返回指示是否成功传输数据的值。如果尝试发送数据时发生错误,将引发 IOError 错误。
|
提示 |
|
发送到 XML 套接字服务器的每条消息必须以换行符 ( |
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000318.html