这两天熟悉了一下SFS2X的部署开发流程,试着写了一个小例子.笔记一下.

例子的流程是:

1.在admintool里创建zone:sfs2x_demo,将其自定义登陆开启.

2.在admintool里创建Room: station.

3.根据客户端的配置文件sfs-config.xml连接到SFS.

4.自定义登陆,验证用户名和密码的合法性.

5.加入房间,

6.设置用户变量,创建客户端avatar.保存位置到用户变量里去.

7.发扩展,avatar走路通知同房间内的所有用户.

8.监听用户离开事件.清除avatar..

最后,将写好的扩展打成jar包放在SFS2X-RC1\SFS2X\extensions\golastroom\目录下,在admintool里配置一下zone的扩展,注意golastroom的扩展文件名须和AdmonTool配置里zone的扩展名字一样.

这样,每个登陆到此zone的用户都必须通过自定义扩展模块的验证..

服务端java

 
  
  1. package com.golastroom.extension; 
  2.  
  3. import com.golastroom.eventHandler.LoginEventHandler; 
  4. import com.golastroom.requestHandler.MoveReqHandler; 
  5. import com.smartfoxserver.v2.annotations.Instantiation; 
  6. import com.smartfoxserver.v2.annotations.Instantiation.InstantiationMode; 
  7. import com.smartfoxserver.v2.core.SFSEventType; 
  8. import com.smartfoxserver.v2.extensions.SFSExtension; 
  9.  
  10.  
  11. @Instantiation(InstantiationMode.SINGLE_INSTANCE) 
  12. public class MyFirstExtension extends SFSExtension { 
  13.  
  14. @Override 
  15. public void init() { 
  16.    trace("=============golastroom =============="); 
  17.    addRequestHandler("move", MoveReqHandler.class); 
  18.    addEventHandler(SFSEventType.USER_LOGIN, LoginEventHandler.class); 
  19.  
  20. @Override 
  21. public void destroy() { 
  22.  
  23.    super.destroy(); 
  24.  

扩展里初始化方法里将处理avatar移动的处理模块和自定义登陆模块注册添加进去.

登陆处理模块

 
  
  1. package com.golastroom.eventHandler; 
  2.  
  3. import com.smartfoxserver.bitswarm.sessions.ISession; 
  4. import com.smartfoxserver.v2.core.ISFSEvent; 
  5. import com.smartfoxserver.v2.core.SFSEventParam; 
  6. import com.smartfoxserver.v2.entities.data.ISFSObject; 
  7. import com.smartfoxserver.v2.exceptions.SFSException; 
  8. import com.smartfoxserver.v2.exceptions.SFSLoginException; 
  9. import com.smartfoxserver.v2.extensions.BaseServerEventHandler; 
  10.  
  11. public class LoginEventHandler extends BaseServerEventHandler { 
  12.  
  13. @Override 
  14. public void handleServerEvent(ISFSEvent event) throws SFSException { 
  15.    String name =(String)event.getParameter(SFSEventParam.LOGIN_NAME); 
  16.    String pass = (String) event.getParameter(SFSEventParam.LOGIN_PASSWORD); 
  17.    ISession session = (ISession) event.getParameter(SFSEventParam.SESSION); 
  18.    ISFSObject paramsOut = (ISFSObject) event.getParameter(SFSEventParam.LOGIN_OUT_DATA); 
  19.    trace(name +" is login .. "); 
  20.    if (name.startsWith("h_") && getApi().checkSecurePassword(session, "123", pass)){ 
  21.     paramsOut.putBool("login"true); 
  22.    }else
  23.     paramsOut.putBool("login"false); 
  24.     //throw new SFSLoginException("用户名必须以\"h_\"开头且密码为:123"); 
  25.    } 
  26.    

 

自定义登陆安全验证只是简单验证此用户的用户名必须以h_开头且密码为123为合法用户,返回登陆验证结果.

avatar移动处理模块

 
  
  1. package com.golastroom.requestHandler; 
  2.  
  3. import com.smartfoxserver.v2.annotations.Instantiation; 
  4. import com.smartfoxserver.v2.annotations.Instantiation.InstantiationMode; 
  5. import com.smartfoxserver.v2.entities.Room; 
  6. import com.smartfoxserver.v2.entities.User; 
  7. import com.smartfoxserver.v2.entities.data.ISFSObject; 
  8. import com.smartfoxserver.v2.extensions.BaseClientRequestHandler; 
  9.  
  10. @Instantiation(InstantiationMode.SINGLE_INSTANCE) 
  11. public class MoveReqHandler extends BaseClientRequestHandler { 
  12.  
  13. @Override 
  14. public void handleClientRequest(User sender, ISFSObject params) { 
  15.    trace(sender.getName()," request!! "); 
  16.    Room room = sender.getLastJoinedRoom(); 
  17.    
  18.    params.putUtfString("name", sender.getName()); 
  19.    send("p", params, room.getUserList()); 
  20.  

移动处理很简单,只是将用户提交的移动数据转发一下,同时将谁移动了也发给所有用户.