SmartFoxServer 2X HOWTOs

»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 +页面进行自动更新。

翻译自http://docs2x.smartfoxserver.com/GettingStarted/howtos

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值