»SmartFoxServer 2X HOWTOs
在本文档中,我们收集了一些关于如何完成在使用SmartFoxServer 2X过程中可能需要的简单和特定任务的快速教程。
如何添加新的Java库或扩展名依赖关系
如何设置与外部数据库的连接
如何创建基于扩展的自定义登录
如何使用SmartFoxBits 2X
如何检查服务器日志
如何调试扩展
如何在扩展程序中调度定时任务
如何从扩展程序发送电子邮件
更多食谱
»如何添加新的Java库或扩展依赖项
在SmartFoxServer 2X中添加新的库是一件轻而易举的事情。不要混淆类路径:所有您需要做的是将.jar文件部署在正确的目录中并重新启动服务器。
我们建议使用两个文件夹:
{SFS2XRoot} / lib /
这是我们建议添加库,如数据库驱动程序或所有区域和服务器本身将使用的其他多用途库。另一个例子是BuddyList存储类的自定义实现。
{SFS2XRoot} / extensions / _ lib _ /
该文件夹建议用于系统中多个扩展程序共享的库。例如“Google Collections”jar或Hibernate jar等。不要将扩展jar添加到此文件夹,因为当您设置Zone / Room配置时,AdminTool将无法检测到它。
最后,如果您有一个或多个jar文件将由一个特定的扩展名使用,您可以在扩展名文件夹中简单的部署这些文件,这些文件将如下所示:{SFS2XRoot} / extensions / {the-extension-name} 。
»如何设置与外部数据库的连接
SFS2X允许以与其前身非常相似的方式连接到数据库。所有您需要做的是从数据库供应商(例如MySQL或MSSQL)下载JDBC连接器,并将.jar放在{SFS2XRoot} / lib /文件夹中。
当然,如果使用ODBC而不是JDBC,您甚至可以跳过驱动程序部署步骤。事实上,ODBC驱动程序已经由Java运行时提供。
以下是可以找到最常见RDBMS的JDBC驱动程序的页面列表:
MySQL JDBC驱动
Microsoft SQLServer JDBC驱动程序
Postgres JDBC驱动程序
Oracle JDBC驱动程序
下一步是运行SFS2X AdminTool,启动Zone Configurator模块,选择您的Zone,最后点击Database Manager选项卡来编辑配置。
在过程结束时,单击提交并重新启动服务器。
»如何创建基于扩展的自定义登录
在服务器端实现自定义登录是一个简单的过程。 SFS2X启动以下两个登录事件。
USER_LOGIN:客户端请求加入区域时触发。 在这里,您可以验证客户端凭据,并确定用户是否可以继续登录过程。 在这个阶段,客户端由Session对象表示,而不是SFSUser对象。
USER_JOIN_ZONE:当客户端成功加入Zone(并变成SFSUser)时通知。
为了添加您的自定义登录逻辑,您应至少执行以下前两个步骤。
1)配置区域
启动AdminTool,打开Zone Configurator模块并启用Zone的使用自定义登录设置; 然后sestart SFS2X。
2)服务器代码
创建一个扩展SFSExtension类的新的服务器端扩展。 你的init()方法应该是这样的:
@Override
public void init()
{
trace("My CustomLogin extension starts!");
// Register for login event
addEventHandler(SFSEventType.USER_LOGIN, LoginEventHandler.class);
}
现在创建LoginEventHandler类,该类将负责用户名/密码检查。 在以下示例中,两个特定用户名不允许登录。
public class LoginEventHandler extends BaseServerEventHandler
{
@Override
public void handleServerEvent(ISFSEvent event) throws SFSException
{
String name = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
if (name.equals("Gonzo") || name.equals("Kermit"))
{
// Create the error code to send to the client
SFSErrorData errData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_USERNAME);
errData.addParameter(name);
// Fire a Login exception
throw new SFSLoginException("Gonzo and Kermit are not allowed in this Zone!", errData);
}
}
}
如果检测到两个不需要的名称之一,则可以触发SFSException。在这样做时,我们提供了一个在服务器端记录的消息和一个包含错误代码(SFSErrorCode.LOGIN_BAD_USERNAME)和错误名称本身的SFSErrorData对象。
在此上下文中使用的典型错误代码是SFSErrorCode.LOGIN_BAD_USERNAME和SFSErrorCode.LOGIN_BAD_PASSWORD,它们都带有一个错误的名称或密码的附加参数。
现在这是一个非常简单的例子,它只是显示如何拒绝访问名为Kermit或Gonzo的用户。当然,你的逻辑可能需要更多的复杂性,但你应该得到这个想法。当您需要停止执行登录过程时,您只需抛出SFSLoginException。
如果没有引发异常,系统将接受用户并继续登录过程。
在这个阶段还有其他一些可能出错的事情,例如:
该区域已满,不允许再登录;
具有相同名称的另一个用户已经登录;
用户当前处于禁止列表中;
用户名可能包含不可接受的错误字词(取决于您的自定义配置);
等等
一旦所有这些检查通过,用户终于登录到该区域。此时,如果您订阅了该服务器代码,服务器代码将收到一个USER_JOIN_ZONE事件。
最后一步是可选的,在许多情况下不需要。
通常,当您需要在用户登录系统后执行特定操作时(如设置用户变量,自动加入房间等),您将使用此功能。
TIP
当使用诸如USER_LOGIN和USER_JOIN_ZONE之类的异步事件时,维护当前事务/操作的状态要困难得多。
维护状态的方便方法是使用用户Session对象。特别是Session对象允许将自定义参数存储为键值对(参见JavaDoc,方法getProperty / setProperty等)。
3)安全密码
出于安全考虑,用户密码永远不会从客户端传输到服务器。为了能够将加密的密码与您的数据库原始密码进行比较,我们在API中提供了一种方便的方法。
getApi().checkSecurePassword(session, clearPass, encryptedPass);
如果密码匹配,则方法调用将返回true,否则返回false。
在客户端,“标准”登录和“自定义”之间绝对没有区别。所有您需要做的是为SFSEvent.LOGIN事件添加侦听器以接收服务器响应,并发送LoginRequest以登录到区域。
您可以查看AS3文档和示例,了解有关如何执行此操作的所有详细信息。对于其他语言,过程是一样的。与此主题相关的另一个有趣的阅读是关于用户权限的讨论。
4)在登录时更改用户名
在某些情况下,您需要在登录时更改用户提供的名称,并从数据库中提取另一个名称。一个例子是当用户使用电子邮件地址作为登录名登录时,但是在数据库中存储了他的昵称,应该使用它而不是电子邮件。
我们已经建立了一个简单的约定,允许您为登录系统提供备用名称。在USER_LOGIN事件中,您传递一个空的SFSObject,可用于将自定义数据返回给客户端。你只需要在一个非常具体(和保留的)密钥名称下的该对象中提供这个名称。见下面的代码:
public class LoginEventHandler extends BaseServerEventHandler
{
@Override
public void handleServerEvent(ISFSEvent event) throws SFSException
{
String name = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
ISFSObject outData = (ISFSObject) event.getParameter(SFSEventParam.LOGIN_OUT_DATA);
// ...
// your login logic goes here
// ...
// Provide a new name for the user:
String newName = "User-" + name;
outData.putUtfString(SFSConstants.NEW_LOGIN_NAME, newName);
}
}
»如何使用SmartFoxBits 2X
与SFS2X一起,我们提供最新版本的SmartFoxBits组件,如果您正在使用Adobe Flash平台构建您的客户端,可以节省大量时间设置应用程序GUI。
基本SmartFoxBits包包含五个组件:
连接器:管理连接/断开过程(也支持新的重新连接系统)
登录:处理登录过程
RoomList:管理“房间”列表,包括“组”功能(允许根据组创建列表的多个视图)
UserList:管理允许私人聊天的用户列表
ChatBox:提供基本的聊天组件
您可以查看所有详细信息,并阅读SmartFoxBits页面上的文档。
»如何检查服务器日志
SFS2X提供了所有活动的详细日志记录。您可以随时通过检查日志/文件夹来查询它们。另外在logs / boot /文件夹下,您可以找到引导阶段的详细日志。
如果服务器有任何问题启动引导日志将帮助您快速找出问题。
»如何调试扩展
您可以轻松地将远程调试器附加到服务器,并启用您最喜欢的调试器来扩展您的扩展。
可以使用sfs2x.bat(Windows)或sfs2x.sh(Linux / Unix / MacOSX)脚本启动SmartFoxServer 2X。通过向启动脚本添加一些JVM切换器,您可以启用远程调试。您可以按照以下步骤操作:
打开AdminTool的服务器配置器模块并转到JVM设置选项卡;
将以下开关添加到JVM选项列表中:
-Xdebug
-Xnoagent
-Xrunjdwp:transport = dt_socket,address = 8787,server = y,suspend = n
提交更改并重新启动SmartFoxServer:现在您将能够启动远程调试会话。
如果要保持脚本允许调试与标准启动脚本分开,只需复制起始脚本,并通过使用文本编辑器添加上述开关来进行修改。然后将脚本保存为debug.sh或debug.bat并启动它。
»如何安排扩展程序中的定时任务
通常,在服务器端游戏逻辑中,有必要使用定时器来发送给客户端的周期性事件(例如,结束时间,npc动作等)。
快速解决这个问题的方法是使用JDK中提供的ScheduledThreadPoolExecutor类,它提供了一个由一个线程池支持的方便的任务执行器。 SFS2X已经运行了这个Executor的自己的实例(包装在一个名为TaskScheduler的类中)。
以下Java代码片段显示了如何使用SmartFoxServer自己的TaskScheduler运行循环任务。
public class SchedulerTestExtension extends SFSExtension
{
private class TaskRunner implements Runnable
{
private int runningCycles = 0;
public void run()
{
try
{
runningCycles++;
trace("Inside the running task. Cycle: " + runningCycles);
if (runningCycles >= 10)
{
trace("Time to stop the task!");
taskHandle.cancel();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
// Keeps a reference to the task execution
ScheduledFuture<?> taskHandle;
@Override
public void init()
{
SmartFoxServer sfs = SmartFoxServer.getInstance();
// Schedule the task to run every second, with no initial delay
taskHandle = sfs.getTaskScheduler().scheduleAtFixedRate(new TaskRunner(), 0, 1, TimeUnit.SECONDS);
}
}
scheduleAtFixedRate方法有四个参数:
一个可执行任务代码的Runnable对象;
执行开始前的初始延迟;
任务执行的时间间隔;
用于表示时间值的时间单位。
调度程序还会公布一个在指定时间后执行一次Runnable任务的调度方法。最后,调度程序的线程池可以在运行时通过resizeThreadPool()方法在动态调整大小。
重要信息:run()方法中发生的运行时异常将阻止Task运行。如果不希望任务被预期的错误中断,请确保捕获可能发生的任何异常。
注意
可以通过AdminTool中的“服务器配置器”模块调整系统TaskScheduler的线程池的初始大小。
»如何从扩展程序发送电子邮件
电子邮件可以直接从您的服务器端代码发送,以提供注册确认,更新,甚至调试和统计报告。
为了启用电子邮件发送,您需要从AdminTool设置Emailer服务:从ServerConfigurator中选择Emailer选项卡,打开服务并设置SMTP参数。
重新启动服务器,您现在可以使用以下几行代码发送电子邮件:
Email myEmail = new SFSEmail("sender@email.com", "recipient@email.it", "Test mail", "Hello from SFS2X");
SmartFoxServer.getInstance().getMailService().sendEmail(myEmail);
发送电子邮件有三种方式:“盲目”,确认事件延迟。 您可以从javadoc中的SFSPostOffice类中了解更多信息。
»更多食谱
我们的SmartFoxServer博客中有更多的食谱。 注意每月更新,并订阅我们的Twitter / FB / G +页面进行自动更新。