套接字连接

在 ActionScript 3.0 中,可以使用两种不同类型的套接字连接:XML 套接字连接和二进制套接字连接。使用 XML 套接字,可以连接到远程服务器并创建服务器连接,该连接在显式关闭之前一直保持打开。这样,无需不断打开新服务器连接,就可以在服务器与客户端之间交换 XML 数据。使用 XML 套接字服务器的另一个好处是用户不需要显式请求数据。您无需请求即可从服务器发送数据,并且可以将数据发送到连接到 XML 套接字服务器的每个客户端。

二进制套接字连接与 XML 套接字类似,不同之处是客户端与服务器不需要专门交换 XML 数据包,连接可以将数据作为二进制信息传输。这样,您就可以连接到各种各样的服务,包括邮件服务器(POP3、SMTP 和 IMAP)和新闻服务器 (NNTP)。

子主题

Socket 类
XMLSocket 类
创建并连接到 Java XML 套接字服务器

Socket 类

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_ENDIANEndian.LITTLE_ENDIAN

提示

 

Socket 类继承 IDataInput 和 IDataOutput 接口(位于 flash.utils 包中)实现的所有方法,应使用这些方法从 Socket 读取数据和向其中写入数据。

XMLSocket 类

ActionScript 提供了一个内置的 XMLSocket 类,使用它可以打开与服务器的持续连接。这种打开的连接消除了反应时间问题,它通常用于实时的应用程序,例如聊天应用程序或多人游戏。传统的基于 HTTP 的聊天解决方案频繁轮询服务器,并使用 HTTP 请求来下载新的消息。与此相对照,XMLSocket 聊天解决方案保持与服务器的开放连接,这一连接允许服务器即时发送传入的消息,而无需客户端发出请求。

要创建套接字连接,必须创建服务器端应用程序来等待套接字连接请求,然后向 SWF 文件发送响应。可以使用 Java、Python 或 Perl 程语言来编写这种类型的服务器端应用程序。要使用 XMLSocket 类,服务器计算机必须运行可识别 XMLSocket 类使用的协议的守护程序。下面的列表说明了该协议:

注意

 

XMLSocket 类不能自动穿过防火墙,因为 XMLSocket 没有 HTTP 隧道功能(这与实时消息传递协议 (RTMP) 不同)。如果您需要使用 HTTP 隧道,应考虑改用 Flash Remoting 或 Flash Media Server(支持 RTMP)。

XMLSocket 对象连接到服务器的方式和位置受以下限制:

注意

 

将服务器设置为与 XMLSocket 对象进行通信可能会遇到一些困难。如果您的应用程序不需要进行实时交互,请使用 URLLoader 类,而不要使用 XMLSocket 类。

可以使用 XMLSocket 类的 XMLSocket.connect()XMLSocket.send() 方法,通过套接字连接与服务器之间传输 XML。XMLSocket.connect() 方法与 Web 服务器端口建立套接字连接。XMLSocket.send() 方法将 XML 对象传递给套接字连接中指定的服务器。

调用 XMLSocket.connect() 方法时,Flash Player 打开与服务器的 TCP/IP 连接,并使该连接保持打开状态,直到发生以下任一事件:

创建并连接到 Java XML 套接字服务器

下面的代码说明一个用 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 中而无法启动服务器,请尝试使用 java -classpath . SimpleServer 启动服务器。

要从 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 套接字服务器的每条消息必须以换行符 (\n) 结束。


Flash CS3

 

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

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