3

我要使用 AIR 创建两个软件:服务器和客户端。AS3 和 AIR 都适用。

我想避免使用远程共享对象、使用 BlazeDS 或必须在中间设置 Java / Python / ... 服务器的大型架构。

为了避免必须在服务器端和客户端解析套接字数据,我考虑在客户端使用 XMLSocket:数据以 Flash 框架已经解析的方式到达。

但是,当我将此 XMLSocket 与 AIR ServerSocket 一起使用时,“connect”事件会在服务器端返回一个原始 Socket。所以我必须在服务器端手动管理 XML 数据。

有没有办法在服务器端也使用 XMLSocket 与客户端通信?一种将返回的 Socket 转换为 XMLSocket 的技巧?

如果有管理它的 AS3 库,我没有找到它。

谢谢!

4

2 回答 2

1

我完全同意 Adrian 的观点,即 ActionScript 中的服务器端代码会很糟糕,Java 在语法上不会那么远会好得多:热点 JIT、多线程、具有许多高度优化的服务器端组件。

话虽如此:XML Socket 为您提供了一个已解析的 XML,但通过网络传输的内容仍然只是作为文本的 XML。所以在性能方面,它与使用常规套接字并自己解析是一样的。这可以很简单:

var text: Object = <data received>
var xml: XML = new XML(text);

因此,一旦您收到完整的 xml 有效负载,您就可以开始使用了。

如果您认为 XMLSocket 可以在解析之前获得完整的 XML,那么我做了一些 XML Socket 的工作,并以两个或更多片段的形式交付 XML,并且必须自己处理它,她举了一个例子:

...
private var xmlData: String = "";
private var errorCount: int;
...

private function dataHandler(e: DataEvent): void {  
  if (errorCount > 2) {
    errorCount = 0;
    xmlData = "";
  }     
  try {             
    xmlData += e.data;
    processMessage(XML(xmlData));
    // valid XML, clear the buffer
    xmlData = "";
  } catch (error: Error) {
    // otherwise log error and wait for the rest of the XML 
    log.error(error.toString());
    log.error(e.data);
    errorCount++
  }
}
于 2011-07-12T06:43:28.997 回答
0

我不能肯定地说服务器端,但我想 AS3 对于服务器来说是一种糟糕的语言(仅仅是由于缺乏多线程支持)。无论如何,您都可以尝试将其转换为新对象:

var myXMLSocket:XMLSocket = myOldRegularSocket;

至少如果它抛出一个错误,这个错误可能会给你一些洞察力。我建议不要使用 XML 套接字,因为它们试图掩盖套接字,但实际上只是将其复杂化。如果您只需要发送 XML 数据,您可以使用几乎相同的“套接字”结构来完成。

AIR 似乎包含一个“ServerSocket”对象类型。这可能是你最好的选择。

花点时间了解“原始”套接字是如何工作的,它将为您节省到处转换数据的时间。正则表达式解析数据的速度比 xml 快得多,尤其是在数据始终是动态的情况下。

于 2011-07-12T04:06:44.530 回答