在利用SmartFoxServer开发多人在线应用或游戏的时候,往往需要获取到指定zone的在线人数,官方自SFS 1.50版之后就给出了解决方法,我们可以利用服务器脚本语言或者actionscript来通过发送xml格式的请求来获到,挺简单,写篇日志记一下actionscript利用xmlsocket来获取的例子:(如想用服务器脚本,请参照官方文档,见文末)
在写代码之前,首先要更改一下sfs的配置文件(config.xml),将配置文件<EnableZoneInfo>true</EnableZoneInfo>中的false改为true来允许获取zone的统计信息,这一步在项目发布后往服务器架设时常常被忘掉,导致在线人数数据无法返回,本人就有这样的惨痛教训。T_T
AS3代码如下:
package { import flash.events.DataEvent; import flash.events.Event; import flash.events.EventDispatcher; import flash.net.XMLSocket; public class ZoneCount { private var _request:String; private var _conn:XMLSocket = new XMLSocket(); public var count:int = 0; public function ZoneCount() { _conn.addEventListener(Event.CONNECT, onConnect); _conn.addEventListener(Event.CLOSE, onClose); _conn.addEventListener(DataEvent.DATA, onData); } public function conn(ip:String, port:int, zoneName:String):void { // 向服务器发送的xml格式请求 _request = ""+zoneName+""; _conn.connect(ip, port); } private function onConnect(e:Event):void { // 如果连接上,就发送请求 if (_conn.connected) _conn.send(_request); } private function onClose(e:Event):void { trace("XMLSocket connect is close."); } private function onData(e:DataEvent):void { var data:String = e.data; // 检查返回的数据中是否包含zInfo关键字 if (data.indexOf("zInfo") > -1) { var xml:XML = new XML(data); // 得到在线人数 count = parseInt(xml.children()[0]); _conn.close(); } } } }
另外在连接的时候如果遇到安全沙箱问题,解决方法有下面几种:
一、在被请求的服务器开设843端口,提供策略内容,详见这里。
二、利用flash.system.Security的loadPolicyFile方法指定策略文件地址来获到策略内容。
三、在swf根目录放置策略文件(crossdomain.xml)。(推荐)
下面是本实例要用到的策略文件内容:
< ?xml version="1.0"?> < !DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
参考自官方文档
后记:
2009.12.12
经测试,该方法返回的xml会有不完整的情况,暂时不知道是因为什么导致的。