使用 Adobe Flex 打开客户端套接字
清单 4 中的代码展示了如何通过 Flex 打开客户端套接字:
清单 4. 通过 Flex 打开客户端
var socket : XMLSocket = new XMLSocket();
// register events:
socket.addEventListener(Event.CLOSE, closehandler);
socket.addEventListener(Event.CONNECT, connectHandler);
socket.addEventListener(Event.OPEN, openHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, readHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.connect("localhost",20340);
完成 socket.connect() 调用后,Flex 将向服务器发送一条请求,要求提供策略文件,期待获得 XML 响应。完成之后,连接即建立,这个套接字现在即可用于从服务器推送数据。
作为拼图的最后一块,您将看到 Flex 如何将 Ajax 作为应用程序调用。为此,要编写一个可处理服务器端消息的通用 JavaScript 函数。我们将此方法命名为 handleServerMessageReceived(message)。此方法会获取来自服务器的 XML 代码,此方法对于消息的处理方式以应用程序为依据。清单 5 中的代码展示了 Flex 如何调用 JavaScript 函数。这是 readHandler 方法的代码,该方法在接收到服务器 XML 消息时被调用。
清单 5. 使用 handleServerMessageReceived(message) 的 readhHandler 代码
public function readHandler(e : DataEvent) : void {
var message : XML = e.data as XML;
ExternalInterface.call("handleServerMessageReceived", message);
}
就是这样!就是这样简单。您已经创建了一个 XML 套接字连接。当来自服务器的数据送达时,您可调用 Ajax 中的某些通用处理函数,处理这些消息。完整源代码可供下载(请参见 下载 部分)。
下面来看看 OpenLaszlo 如何实现相同的目标。
使用 OpenLaszlo 打开客户端套接字
由于 OpenLaszlo 应用程序以 Flash 和 DHTML 平台为目标,因而其 API 和脚本语言类似于 Flash 和 JavaScript。这主要是为希望迁移到 OpenLaszlo(作为 RIA 的替代方案)的 Web 开发人员提供便利。
OpenLaszlo 提供了两种创建与后端之间的持久连接的方法。一种方法要使用 Lz(Laszlo 的缩写)标准库中提供的 ConnectionManager API。但其文档明确说明了以下内容:
“警告:这项特性是临时的。此特性用于容量有限的环境,能够用于开发,但我们不推荐使用此特性进行部署(不包括低容量、非任务关键型的部署)。若对使用此版本的持久连接的应用程序的健壮性有任何问题,请直接咨询 Laszlo Systems。”
或许目前这是一项实验技术,但在未来的 OpenLaszlo 版本中,它将得到证实。
第二种方法与 Flex 相似,您要手动打开 XML 套接字连接,等待 READ_DATA 事件发生。清单 6 展示了实现方法。
清单 6. 定义 XMLSocket 类
// connect the socket here:
xml_socket.connect(host,port);
ExternalInterface.call(‘handleServerMessageReceived',messageXML);
]]>
(为简短起见,忽略了其他处理方法。在本文的 下载 部分中可获得完整的代码清单。)
就是这样,创建一个套接字对象并连接此对象就是这样轻松。这一代码清单创建了一个名为 ClientSocket 的新类,随后声明了一个名为 “xml_socket” 的 XML 套接字对象。只要此套接字对象读取到来自服务器的数据,就会触发 onData 事件,该事件将由为 onData 定义的处理方法处理。最后,在 onData 处理方法中,调用 Ajax 应用程序中的外部 JavaScript 函数。此后的流程与 Flex 客户端相同。
要创建 ClientSocket 对象,只需声明它即可:
清单 7. 声明 ClientSocket
为 ClientSocket 触发了 init 事件时,将尝试连接指定主机和端口的后端。(请参见清单 6 中的 oninit 处理方法。)