package ALBasicClient; import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.concurrent.locks.ReentrantLock; import ALBasicServer.ALServerSynTask.ALSynTaskManager; /********************* * 在服务器架构内连接服务器的客户端对象,在接受消息后统一使用同步任务进行处理 * * @author alzq.z * @email zhuangfan@vip.163.com * @time May 28, 2014 11:32:21 PM */ public abstract class _AALBasicServerClientListener extends _AALBasicClientListener { /** 接收到的消息管理队列信息 */ private ReentrantLock _m_msgMutex; private LinkedList<ByteBuffer> _m_lMsgList; public _AALBasicServerClientListener(String _serverIP, int _serverPort) { super(_serverIP, _serverPort); _m_msgMutex = new ReentrantLock(); _m_lMsgList = new LinkedList<ByteBuffer>(); } @Override public void receiveMes(ByteBuffer _mes) { addMessage(_mes); } /******************** * 添加一个需要处理的消息 * * @author alzq.z * @time Mar 4, 2013 10:19:30 PM */ public void addMessage(ByteBuffer _msg) { //消息无效或角色无加载完成则直接返回 if(null == _msg) return ; boolean needStartTask = false; _lock(); if(_m_lMsgList.isEmpty()) needStartTask = true; _m_lMsgList.addLast(_msg); _unlock(); if(needStartTask) ALSynTaskManager.getInstance().regTask(new ALSynServerClientDealMessageTask(this)); } /****************** * 自行从消息队列中取出一个消息进行处理 * * @author alzq.z * @time Mar 4, 2013 10:24:27 PM */ public void dealMessage() { ByteBuffer msg = null; boolean needContinueTask = false; //取出第一个消息 _lock(); if(!_m_lMsgList.isEmpty()) msg = _m_lMsgList.getFirst(); _unlock(); if(null != msg) { //处理消息 try { this._dealMes(msg); } catch(Exception ex) { ex.printStackTrace(); } } _lock(); _m_lMsgList.pop(); //判断消息队列是否为空 if(!_m_lMsgList.isEmpty()) needContinueTask = true; _unlock(); if(needContinueTask) ALSynTaskManager.getInstance().regTask(new ALSynServerClientDealMessageTask(this)); } protected void _lock() { _m_msgMutex.lock(); } protected void _unlock() { _m_msgMutex.unlock(); } /******************** * 玩家角色消息数据的处理函数 * * @author alzq.z * @time Mar 4, 2013 10:46:06 AM */ protected abstract void _dealMes(ByteBuffer _msg); }