package com.dy.testClient.tcpConnect; import java.util.*; import org.apache.mina.core.session.IoSession; public class MinaConnectPool { /** * 空闲会话的池(Hashtable是线程安全的) */ private static Hashtable> freeSessions = new Hashtable>(); /** * 从会话池中得到空闲的会话,如果没有空闲的会话,本着快速反应的原则,新建一个会话,不再等待繁忙会话的释放 * @param host * @param port * @return * @throws Exception */ public static IoSession getSession(String host , int port , int connectTimeout) throws Exception{ Vector vecter = freeSessions.get(getKey(host , port)) ; if(vecter == null){ vecter = new Vector() ; freeSessions.put(getKey(host , port), vecter) ; } MinaConnect con = new MinaConnect() ; IoSession se = popSession(vecter , con) ; if(se == null){ MinaHandler handler = new MinaHandler(connectTimeout) ; se = createNewSession(host, port, connectTimeout, con, handler) ; } return se ; } /** * 将会话放回池中 * @param host * @param port * @param se */ public static void freeSession(String host , int port , IoSession se){ if(se == null){ return ; } Vector vecter = freeSessions.get(getKey(host , port)) ; if(vecter == null){ vecter = new Vector() ; freeSessions.put(getKey(host , port), vecter) ; } putSession(vecter, se) ; } /** * 从会话池中取得空闲的会话 * @param vecter * @return */ private static IoSession popSession(Vector vecter , MinaConnect con){ IoSession se = null ; while(se == null && !vecter.isEmpty()){ se = (IoSession)vecter.firstElement() ; if(se != null){ vecter.removeElementAt(0) ; } if(!con.isConnected(se)){ se = null ; } } return se ; } /** * 放新会话 * @param vecter * @param se */ private static void putSession(Vector vecter , IoSession se){ vecter.addElement(se) ; } /** * 创建新会话 * @param host * @param port * @param connectTimeout * @param con * @return * @throws Exception */ private static IoSession createNewSession(String host , int port , int connectTimeout, MinaConnect con , MinaHandler handler) throws Exception{ return con.createSession(host, port, connectTimeout , handler) ; } /** * 得到会话池的key * @param url * @param port * @return */ private static String getKey(String host , int port){ return host + port ; } }