`
wakin2003
  • 浏览: 67888 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

实现的一个简单的TCP连接池

阅读更多
实现一个非常基础的TCP连接池,仅作参考。呵呵。
import java.net.Socket;
import java.util.Hashtable;
/**
 * 简单TCP连接池的实现
 * @author wakin
 *
 */
public class ConnectionPool
{
	private static final int CONNECTION_POOL_SIZE = 10;  //全局常量
	private static final String API_SERVER_HOST = "127.0.0.1";
	private static final int API_SERVER_PORT = 8888;
	private static ConnectionPool self = null;
	private Hashtable<Integer, Socket> socketPool = null;    //连接池
	private boolean [] socketStatusArray = null; //连接的状态(true-被占用,false-空闲)
	/**
	 * 初始化连接池,最大TCP连接的数量为10
	 */
	public static synchronized void init() {
		self = new ConnectionPool();
		self.socketPool = new Hashtable<Integer, Socket>();
		self.socketStatusArray = new boolean [CONNECTION_POOL_SIZE];
		//初始化连接池
		System.out.println("初始化连接池.");
		buildConnectionPool();
	}
	/**
	 * 建立连接池
	 */
	public synchronized static void buildConnectionPool() {
		if(self==null)
			init();
		System.out.println("准备建立连接池.");
		Socket socket = null;
		try {
			for(int i=0;i<CONNECTION_POOL_SIZE;i++){
				socket = new Socket(API_SERVER_HOST,API_SERVER_PORT);
				self.socketPool.put(new Integer(i), socket);
				self.socketStatusArray[i] = false;
				}
		} catch (Exception e) {
			System.out.println("连接池建立失败!");
			throw new RuntimeException(e);  //抛出
		}
		System.out.println("连接池建立成功.");
	}
	/**
	 * 从连接池中获取一个空闲的Socket
	 * @return 获取的TCP连接
	 */
	public static Socket buildConnection(){
		if(self==null)
			init();
		int i = 0;
		for(i=0;i<CONNECTION_POOL_SIZE;i++){
			if(!self.socketStatusArray[i]){
				self.socketStatusArray[i] = true;
				break;
			}
		}
		if(i<=CONNECTION_POOL_SIZE) {
			System.out.println("连接池中的第"+i+"个连接");
			return self.socketPool.get(new Integer(i));
		}
		else {
			System.out.println("从连接池建立连接失败,没有空闲的连接");
			throw new RuntimeException("No enough pooled connection");
		}
	}
	/**
	 * 当获得的socket不可用时,重新获得一个空闲的socket。
	 * @param socket 不可用的socket
	 * @return 新得到的socket
	 */
	public static Socket rebuildConnection(Socket socket) {
		if(self==null)
			init();
		Socket newSocket = null;
		try {
			for(int i=0;i<CONNECTION_POOL_SIZE;i++) {
				if(self.socketPool.get(new Integer(i))==socket){
					System.out.println("重建连接池中的第"+i+"个连接");
					newSocket = new Socket(API_SERVER_HOST,API_SERVER_PORT);
					self.socketPool.put(new Integer(i), newSocket);
					self.socketStatusArray[i] = true;
				}
			}
			
		} catch (Exception e) {
			System.out.println("重建连接失败!");
			throw new RuntimeException(e);
		}
		return newSocket;
	}
	/**
	 * 将用完的socket放回池中,调整为空闲状态。此时连接并没有断开。
	 * @param socket 使用完的socket
	 */
	public static void releaseConnection(Socket socket){
		if(self==null){
			init();
		}
		for(int i=0;i<CONNECTION_POOL_SIZE;i++){
			if(self.socketPool.get(new Integer(i))==socket){
				self.socketStatusArray[i] = false;
				System.out.println("释放连接 "+i);
				break;
			}
		}
	}
	/**
	 * 断开池中所有连接
	 */
	public synchronized static void releaseAllConnection() {
		if(self==null)
			init();
		
		//关闭所有连接
		Socket socket = null;
		for(int i=0;i<CONNECTION_POOL_SIZE;i++){
			socket = self.socketPool.get(new Integer(i));
			try {
				socket.close();
				self.socketStatusArray[i] = false;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println("全部连接已经关闭。");
	}
	/**
	 * 重新建立连接池。
	 */
	public static void reset() {
		self = null;
		System.out.println("重建连接池...");
		init();
	}
}
0
1
分享到:
评论
3 楼 qq136134525 2011-08-22  
高手,谢谢分享。。!
2 楼 gongsy 2009-08-12  
      大大方方
1 楼 kazy 2009-04-29  
外部程序是如何知道连接池中某个连接有数据到达的?最好能有个使用的例子

相关推荐

    Go-gpool一个gotcp连接池

    Go-gpool是一个专门为Go语言设计的TCP连接池库,它实现了对`net.Conn`接口的兼容,使得开发者能够方便地在自己的TCP应用中利用连接池技术来提高性能和效率。在Go语言的网络编程中,连接池是一个重要的优化手段,尤其...

    okhttp中连接池实现

    否则,会创建一个新的TCP连接并将其添加到连接池中。这个过程涉及到对目标主机、端口和协议的匹配,确保连接能被正确地重用。 2. **连接对象的移除**:连接池中的连接不是无限期保留的。OkHttp有一套策略来决定何时...

    C# Socket连接池

    具体实现时,我们可以设计一个连接池类,包含以下几个核心部分: 1. 初始化:设置最大连接数,初始化空闲连接列表。 2. 获取连接:当有新的网络请求时,从连接池中取出一个可用的Socket,如果没有则等待或创建新的...

    socket 客户端连接池实现

    在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或ConcurrentHashMap的数据结构来管理和维护连接。同时,可以结合JMX(Java Management Extensions)进行监控,查看连接...

    kafka生产者连接池

    连接池的核心思想是减少频繁的资源分配与释放,通过复用已存在的连接,避免了频繁的TCP三次握手和四次挥手过程,提升了整体系统的稳定性和效率。 Apache Commons Pool 2(在提供的文件`commons-pool2-2.3.jar`中)...

    用nio实现异步连接池

    常连接是指一个持久存在的TCP连接,避免了频繁创建和销毁连接带来的系统资源消耗和性能损耗。然而,当应用需要与多个后台服务交互时,传统的串行处理模式(即逐一访问每个服务)会导致性能瓶颈和系统健壮性下降。 ...

    java socket连接池

    2. 借用与归还:当客户端请求到来时,服务器从连接池中取出一个已建立的Socket连接,用于处理请求。完成后,不再关闭连接,而是将其归还到池中,供后续请求使用。 3. 管理:连接池管理器负责维护池中连接的状态,...

    swoole-连接池

    - **连接复用**:当客户端请求到来时,从连接池中取出一个空闲连接,进行数据交互,完成后并不关闭,而是放回连接池,供后续请求使用。 - **连接管理**:连接池会监控每个连接的状态,确保连接的有效性,如果发现有...

    Socket连接池的简单应用

    ### Socket连接池的简单应用 #### 一、引言 在网络通信中,Socket作为一种基本的通信方式被广泛应用。然而,在实际开发过程中,直接使用系统自带的Socket库可能会遇到各种复杂性和性能上的挑战。例如,频繁地建立...

    数据库连接池原理

    - 当执行一个SQL命令时,如果没有连接池,那么每次都需要经历完整的连接和断开过程,这包括TCP连接的三次握手、数据库认证的三次握手、SQL执行、数据库关闭以及TCP的四次挥手关闭。这种方式虽然实现简单,但是存在...

    ActiveMQ连接池完整封装实例工具类

    以下是一个简单的ActiveMQ连接池工具类的伪代码: ```java public class ActiveMQPoolUtil { private static PooledConnectionFactory factory; private static Connection connection; static { // 初始化...

    QT 支持多客户端链接TCP服务器,外带数据库连接池

    在“QT支持多客户端链接TCP服务器,外带数据库连接池”这个项目中,我们将探讨如何利用QT库构建一个能同时处理多个客户端连接的TCP服务器,并有效地管理数据库连接。 首先,我们要构建TCP服务器,这主要依赖于QT的...

    mina UDP 数据库连接池

    总的来说,基于MINA的UDP数据库连接池实现了高效、可靠的UDP数据接收和数据库操作,利用了MINA的异步特性、线程池的并发处理能力以及数据库连接池的资源复用,有效解决了UDP通信与数据库交互中的性能和稳定性问题。...

    fastdfs:带有 tcp 连接池的 fastdfs 客户端

    TCP连接池,即TCP连接复用技术,是在应用中维护一个连接集合,供多个请求复用,避免了频繁创建和销毁TCP连接的开销。TCP连接池可以显著提高系统性能,减少网络延迟,提高并发处理能力,并有助于控制最大并发连接数,...

    socket线程连接池实例

    3. **创建并启动线程**:在每个线程中,我们可以从连接池中获取一个可用的Socket对象,执行相应的网络操作,例如发送数据或接收响应。完成操作后,必须将Socket对象归还到连接池中,以便其他线程可以重复使用。 4. ...

    用java的nio技术实现的异步连接池

    在这个项目中,我们关注的是如何利用Java NIO来实现一个异步连接池。连接池是一种优化资源管理的技术,它通过复用已建立的数据库或其他网络连接,避免频繁地创建和销毁连接,从而提高系统性能。 异步连接池的核心...

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    * 多线程通过`套接字通信`取出连接池中的一个连接,然后和服务器直接进行通信,通信之后再将此连接`还给连接池`(减少数据库连接和断开的次数) * 数据库连接池对应C++中的一个数据库连接对象,即`单例模式` * 连接池...

    SQL-ADOConnection数据库连接池

    - **定义**:TADOPool 类实现了一个数据库连接池,可以复用已经建立的数据库连接。 - **属性**: - `FSection`: 临界区对象,用于同步对连接池的操作。 - `FPoolNumber`: 连接池中的连接数量。 - `...

    破解TCP连接数限制

    3. **使用连接池**:连接池是一种管理TCP连接的机制,它允许多个应用程序共享有限数量的连接,而不是每个应用都创建新的连接。这种方式可以有效地利用有限的连接资源,并减少建立和关闭连接的开销。 4. **代理...

    一个非常简洁的网络连接池,可以通过他来构建特定协议的连接池

    标题提到的"一个非常简洁的网络连接池,可以通过他来构建特定协议的连接池",这通常指的是一个轻量级、易于使用的库,它允许开发者为特定的网络协议(如HTTP、TCP、MySQL等)创建和管理连接池。这样的工具可以极大地...

Global site tag (gtag.js) - Google Analytics