在利用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会有不完整的情况,暂时不知道是因为什么导致的。
浙公网安备 33010602011771号