用XMLSocket获得SmartFoxServer的zone在线人数

在利用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 = "<msg t=\"sys\"><body r=\"-1\" action=\"zInfo\">"+zoneName+"</body></msg>";
			_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">
 
<!-- Policy file for xmlsocket://socks.example.com -->
<cross -domain-policy> 
 
   <!-- This is a master socket policy file -->
   <!-- No other socket policies on the host will be permitted -->
   <site -control permitted-cross-domain-policies="all"/>
 
   <!-- Instead of setting to-ports="*", administrator's can use ranges and commas -->
   <!-- This will allow access to ports 123, 456, 457 and 458 -->
   <allow -access-from domain="*" to-ports="80,9339" />
 
</cross>

参考自官方文档

后记:
2009.12.12
经测试,该方法返回的xml会有不完整的情况,暂时不知道是因为什么导致的。

你可能还对下面的日志感兴趣:

相关标签: Development & Design and tagged , .

One Response to 用XMLSocket获得SmartFoxServer的zone在线人数

  1. Nick says:

    请问,您有写过模拟同时有1000个人连线到SmartfoxServer的测试程序吗??

    可以指点一下呢??thanks

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>