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

posted on 2012-02-05 15:33  tianliangle  阅读(380)  评论(0编辑  收藏  举报