JDK6.0学习笔记(十)TCP连接池

  1. /**
  2.  * TCP开发 连接池
  3.  * */
  4. import java.net.Socket;
  5. import java.util.Hashtable;
  6. public class ConnectionPool {
  7.     private static final int CONNECTION_POOL_SIZE = 10;
  8.     private static final String API_SERVER_HOST = "127.0.0.01";
  9.     private static final int API_SERVER_PORT = 80;
  10.     private static ConnectionPool self = null;// ConnectionPool的唯一实例
  11.     private Hashtable socketPool = null;// 连接池
  12.     private boolean[] socketStatusArray = null;// 连接的状态(true-被占用;false-空闲)
  13.     public static synchronized void init() {
  14.         self = new ConnectionPool();
  15.         self.socketPool = new Hashtable();
  16.         self.socketStatusArray = new boolean[CONNECTION_POOL_SIZE];
  17.         // 初始化连接池
  18.         self.buildConnectionPool();
  19.     }
  20.     public static synchronized void reset() {
  21.         self = null;
  22.         init();
  23.     }
  24.     public static Socket getConnection() {
  25.         if (self == null)
  26.             init();
  27.         int i = 0;
  28.         for (i = 0; i < CONNECTION_POOL_SIZE; i++) {
  29.             if (!self.socketStatusArray[i]) {
  30.                 self.socketStatusArray[i] = true;
  31.                 break;
  32.             }
  33.         }
  34.         if (i <= CONNECTION_POOL_SIZE)
  35.             return (Socket) self.socketPool.get(new Integer(i));
  36.         else {
  37.             System.out.println("从连接池中获取与邮局的连接失败,已经没有空闲连接!");
  38.             throw new RuntimeException("No enough pooled connections.");
  39.         }
  40.     }
  41.     public static void releaseConnection(Socket socket) {
  42.         if (self == null)
  43.             init();
  44.         for (int i = 0; i < CONNECTION_POOL_SIZE; i++) {
  45.             if (((Socket) self.socketPool.get(new Integer(i))) == socket) {
  46.                 self.socketStatusArray[i] = false;
  47.                 break;
  48.             }
  49.         }
  50.     }
  51.     public static Socket rebuildConnection(Socket socket) {
  52.         if (self == null)
  53.             init();
  54.         Socket newSocket = null;
  55.         for (int i = 0; i < CONNECTION_POOL_SIZE; i++) {
  56.             try {
  57.                 if (((Socket) self.socketPool.get(new Integer(i))) == socket) {
  58.                     System.out.println("重建连接池中的第" + i + "个连接.");
  59.                     newSocket = new Socket(API_SERVER_HOST, API_SERVER_PORT);
  60.                     self.socketPool.put(new Integer(i), newSocket);
  61.                     self.socketStatusArray[i] = true;
  62.                     break;
  63.                 }
  64.             } catch (Exception e) {
  65.                 System.out.println("重建连接失败!");
  66.                 throw new RuntimeException(e);
  67.             }
  68.         }
  69.         return newSocket;
  70.     }
  71.     public synchronized static void buildConnectionPool() {
  72.         if (self == null)
  73.             init();
  74.         System.out.println("准备建立连接池.");
  75.         Socket socket = null;
  76.         try {
  77.             for (int i = 0; i < CONNECTION_POOL_SIZE; i++) {
  78.                 socket = new Socket(API_SERVER_HOST, API_SERVER_PORT);
  79.                 self.socketPool.put(new Integer(i), socket);
  80.                 self.socketStatusArray[i] = false;
  81.             }
  82.         } catch (Exception e) {
  83.             System.out.println("与邮局的连接池建立失败!");
  84.             throw new RuntimeException(e);
  85.         }
  86.     }
  87.     public synchronized static void releaseAllConnection() {
  88.         if (self == null)
  89.             init();
  90.         // 关闭所有连接
  91.         Socket socket = null;
  92.         for (int i = 0; i < CONNECTION_POOL_SIZE; i++) {
  93.             socket = (Socket) self.socketPool.get(new Integer(i));
  94.             try {
  95.                 socket.close();
  96.             } catch (Exception e) {
  97.             }
  98.         }
  99.     }
  100. }
 

你可能感兴趣的:(JDK6.0学习笔记)