package ALBasicServer.ALVerifyObj;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.concurrent.locks.ReentrantLock;
import ALBasicServer.ALServerAsynTask.ALAsynTaskManager;
import ALBasicServer.ALServerSynTask.ALSynTaskManager;
import ALBasicServer.ALSocket.ALBasicServerSocket;
import ALBasicServer.ALSocket._AALBasicServerSocketListener;
import ALBasicServer.ALSocket.ALServerSocketMgr;
import BasicServer.S2C_BasicClientVerifyResult;
/******************
* 连接Socket验证的管理对象
*
* @author alzq.z
* @email zhuangfan@vip.163.com
* @time Feb 19, 2013 2:36:33 PM
*/
public class ALVerifyObjMgr
{
private static int g_verifySerialize = 1;
private static ALVerifyObjMgr g_instance = new ALVerifyObjMgr();
public static ALVerifyObjMgr getInstance()
{
if(null == g_instance)
g_instance = new ALVerifyObjMgr();
return g_instance;
}
private Hashtable<Integer, ALBasicServerSocket> _m_htVerifySocket;
/** 验证处理对象的队列 */
private ReentrantLock _m_mutex;
private ArrayList<_IALVerifyFun> _m_arrVerifyFunList;
public ALVerifyObjMgr()
{
_m_htVerifySocket = new Hashtable<Integer, ALBasicServerSocket>();
_m_mutex = new ReentrantLock();
_m_arrVerifyFunList = new ArrayList<_IALVerifyFun>();
}
/************
* 注册一个验证处理对象,并返回验证处理对象的下标
*
* @author alzq.z
* @time Jan 22, 2014 11:50:33 PM
*/
public int regVerifyObj(_IALVerifyFun _verifyFun)
{
_m_mutex.lock();
int newIdx = _m_arrVerifyFunList.size();
_m_arrVerifyFunList.add(_verifyFun);
_m_mutex.unlock();
return newIdx;
}
/************
* 获取验证处理的对象
*
* @author alzq.z
* @time Jan 22, 2014 11:50:33 PM
*/
public _IALVerifyFun getVerifyObj(int _verifyFunIdx)
{
_m_mutex.lock();
try
{
return _m_arrVerifyFunList.get(_verifyFunIdx);
}
finally
{
_m_mutex.unlock();
}
}
/****************
* 添加一个需要验证的Socket对象
*
* @author alzq.z
* @time Feb 19, 2013 2:37:43 PM
*/
public void addVerifySocket(ALBasicServerSocket _socket)
{
int serialize = _getSerizlize();
_m_htVerifySocket.put(serialize, _socket);
//开启一个异步任务用于验证Socket的合法性
ALAsynTaskManager.getInstance().regSysTask(new AsynRun_UserLoginTask(serialize, _socket));
//开启定时任务检测是否登录超时,超时则直接按照失败处理
ALSynTaskManager.getInstance().regTask(new SynCheckVerifyLoginTimeOutTask(serialize), 30000);
}
/*************
* 带入处理序列号,设置处理结果。
*
* @author alzq.z
* @time Feb 19, 2013 2:41:52 PM
*/
protected void _comfirmVerifyResult(int _serialize, _AALBasicServerSocketListener _listener)
{
_comfirmVerifyResult(_serialize, _listener, "");
}
protected void _comfirmVerifyResult(int _serialize, _AALBasicServerSocketListener _listener, String _customRetMsg)
{
ALBasicServerSocket socket = _m_htVerifySocket.remove(_serialize);
if(null == socket)
return ;
if(null == _listener)
{
ALServerSocketMgr.getInstance().kickUser(socket);
}
else
{
//设置Socket和Listener相互的关联
socket.setListener(_listener);
_listener.setSocket(socket);
socket.setLoginEnd();
//创建返回协议
S2C_BasicClientVerifyResult retMsg = new S2C_BasicClientVerifyResult();
retMsg.setSocketID(socket.getSocketID());
retMsg.setCustomRetMsg(_customRetMsg);
//发送登录完成的协议返回
_listener.send(retMsg.makePackage());
_listener.login();
}
}
/***************
* 获取新的验证序列号
*
* @author alzq.z
* @time Feb 19, 2013 3:14:37 PM
*/
private synchronized int _getSerizlize()
{
return g_verifySerialize++;
}
}