package ALBasicServer.ALSocket; import java.nio.channels.SocketChannel; import java.util.Hashtable; import ALBasicServer.ALServerSynTask.ALSynTaskManager; import ALServerLog.ALServerLog; /**************** * 所有连接到本服务器的Socket的管理对象 * * @author alzq.z * @email zhuangfan@vip.163.com * @time Feb 19, 2013 11:56:18 AM */ public class ALServerSocketMgr { private static ALServerSocketMgr g_instance; public static ALServerSocketMgr getInstance() { if(null == g_instance) g_instance = new ALServerSocketMgr(); return g_instance; } /** 注册的相关Socket对象,通过连接的SocketChannel对象作为索引Key */ private Hashtable<SocketChannel, ALBasicServerSocket> _m_htSocketRegTable; /** 还未注册的socket对象链表 */ protected ALServerSocketMgr() { _m_htSocketRegTable = new Hashtable<SocketChannel, ALBasicServerSocket>(); } /******************* * 注册Socket对象 * * @author alzq.z * @time Feb 19, 2013 11:59:38 AM */ public void regSocket(ALBasicServerSocket _socket) { _m_htSocketRegTable.put(_socket._getSocketChannel(), _socket); } /******************** * 获取socket对象 * * @author alzq.z * @time Feb 19, 2013 11:59:42 AM */ public ALBasicServerSocket getSocket(SocketChannel _channel) { return _m_htSocketRegTable.get(_channel); } /********************* * 删除注册的对象 * * @author alzq.z * @time Feb 19, 2013 11:59:48 AM */ public void unregSocket(SocketChannel _channel) { ALBasicServerSocket socket = _m_htSocketRegTable.remove(_channel); kickUser(socket); } /******************* * 剔除已连接的Socket的操作 * * @author alzq.z * @time Feb 19, 2013 11:59:54 AM */ public void kickUser(ALBasicServerSocket _socket) { if(null == _socket) return ; ALServerLog.Info(_socket.getUserName() + " Disconnected!"); SocketChannel channel = _socket._getSocketChannel(); if(null != channel) { _m_htSocketRegTable.remove(channel); //移除Socket中的发送Channel对象 _socket._removeChannel(); try { channel.close(); } catch (Exception e) {} } //插入断开连接的处理任务 ALSynTaskManager.getInstance().regTask(new SynDisconnectTask(_socket)); } }