»连接阶段
与SFS2X的连接分两步执行。
物理TCP连接打开到服务器
在客户端和服务器之间执行交换一定数量参数的“握手”
在握手期间,服务器会验证是否支持客户端API版本,并发回客户端本地存储的一些设置。
ActionScript 3代码的以下代码段来自示例程序包中可用的Connector示例(其他语言提供了类似的示例)。
public class Connector extends Sprite
{
private var sfs:SmartFox
public function Connector()
{
// Create an instance of the SmartFox class
sfs = new SmartFox()
// Turn on the debug feature
sfs.debug = true
// Add SFS2X event listeners
sfs.addEventListener(SFSEvent.CONNECTION, onConnection)
sfs.addEventListener(SFSEvent.CONNECTION_LOST, onConnectionLost)
sfs.addEventListener(SFSEvent.CONFIG_LOAD_SUCCESS, onConfigLoadSuccess)
sfs.addEventListener(SFSEvent.CONFIG_LOAD_FAILURE, onConfigLoadFailure)
// Connect button listener
bt_connect.addEventListener(MouseEvent.CLICK, onBtConnectClick)
dTrace("SmartFox API: " + sfs.version)
dTrace("Click the CONNECT button to start...")
}
private function onBtConnectClick(evt:Event):void
{
// Load the default configuration file, config.xml
sfs.loadConfig()
}
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// SFS2X event handlers
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
private function onConnection(evt:SFSEvent):void
{
if (evt.params.success)
{
dTrace("Connection Success!")
}
else
{
dTrace("Connection Failure: " + evt.params.errorMessage)
}
}
private function onConnectionLost(evt:SFSEvent):void
{
dTrace("Connection was lost. Reason: " + evt.params.reason)
}
private function onConfigLoadSuccess(evt:SFSEvent):void
{
dTrace("Config load success!")
dTrace("Server settings: " + sfs.config.host + ":" + sfs.config.port)
}
private function onConfigLoadFailure(evt:SFSEvent):void
{
dTrace("Config load failure!!!")
}
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Utility methods
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
private function dTrace(msg:String):void
{
ta_debug.text += "-- " + msg + "\n";
}
}
代码首先创建SmartFox对象,这是主要的API类。然后,我们通过使用SFSEvent类注册我们要监听的服务器事件来继续。
下一步是加载一个包含我们连接详细信息的外部.xml配置文件。这是一种方便的方法,可以将连接参数与代码分开,以便随时更改连接参数,而无需重新编译代码。如果您熟悉SmartFoxServer 1.x,您会发现这个系统与其前身非常相似。
注意:如果您采用使用名为sfs-config.xml的文件的标准惯例,则不必指定任何配置文件名。
请查看本教程了解更多信息。
»建立连接后要做什么?
开始与服务器的连接确保客户端能够“说出”SFS2X协议,但在这一点上,客户端在系统中作为真实用户无法识别。在客户端可以开始与服务器和其他用户自由交互之前,还有一个强制性步骤:登录。
登录阶段将连接的客户端促成真正的用户,并将其加入到可用的区域之一中。但是在我们继续第二阶段之前,还有一些关于我们需要检查的连接的事情。
»什么可能出错?
在本地环境中,不太可能出现任何问题,您应该能够快速连接,但是在通过互联网连接的“真实客户端”的生产服务器中,可能会出现一些问题。
通常,您可能会发现用户抱怨连接失败,原因如下。
防火墙问题:客户端位于不允许在默认服务器端口(TCP 9933)上连接的防火墙后面。如果客户端正在运行本地防火墙,建议您向SFS2X端口授予权限。另一方面,如果客户端在公司防火墙后面,则可以使用BlueBox连接以不同的方式解决问题(稍后再说明)。
代理问题:代理服务器可能站在客户端和SFS2X之间,使得无法建立直接套接字连接。再次,这是更典型的企业网络,BlueBox也将在这里拯救。
Flash Player或Unity Player跨域策略问题:基于浏览器的插件(如Flash和Unity)需要访问其域外的资源的特殊权限。因此,您可能需要配置允许套接字连接到SFS2X的跨域策略文件。
您可以在本指南中找到有关如何解决客户端连接故障的其他信息。
»BlueBox
BlueBox技术包含在SFS2X中,与之前的版本不同,它是可选附件。 BlueBox提供了一个高性能的HTTP隧道引擎,允许用户代理和其他受限制的网络条件全速享受多人游戏应用和游戏。
您可以在此专用文档中阅读有关BlueBox的所有信息。
»高度弹性连接(HRC)系统
SFS2X中引入的一个重要功能是低级机制,允许以完全透明的方式为开发人员恢复突然断开连接。当您的区域中的HRC打开时,客户端API将检测到意外的断开连接,并尝试在Zone级别配置的一定时间内重新连接到服务器。
整个过程都发生在幕后,开发人员会收到不同的事件通知。
CONNECTION_RETRY:当API检测到连接突然丢失并重新连接到服务器时,将调度此事件。
CONNECTION_RESUME:重新连接成功时通知此事件。如果重新连接失败,将会发送SFSEvent.CONNECTION_LOST事件。
在服务器端,扩展开发人员可以通过侦听SFSEventType.USER_RECONNECTION_TRY和SFSEventType.USER_RECONNECTION_SUCCESS事件来以相同的方式处理这种情况。
为了打开此功能,您需要从AdminTool(在下图中突出显示)在Zone Configurator模块的“常规”选项卡中配置“用户重新连接时间帧”参数。
该值以秒数表示,任何大于零的值将激活系统。 通常的设置范围在30到60秒之间,具体取决于您的应用需求,并且您的服务器逻辑等待一个丢失的播放器。
为了测试重新连接功能,您可以通过调用由主SmartFox类公开的客户端API方法killConnection()来模拟突然的断开连接。
注意:请勿尝试通过拔出以太网电缆或关闭WIFI连接来测试重新连接系统。 两个操作都不会终止您当前的套接字连接,因此断开事件将永远不会被触发。
有关HRC +系统的更详细的概述,请阅读这里。
翻译自http://docs2x.smartfoxserver.com/DevelopmentBasics/connection-phase