(原创)当server碰到server,socket连接池简单实…

2008-02-23 10:09:44来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

当我们在程序中启动了一个server,这个server需要跟另一个server(比如建立在老系统上的老的c程序)之间通讯,为了增加效率需要建立一个连接池的时候不妨考虑下我的解决方案,不足处清指正。

1:SocketAdapter类,此类继承了socket,重载了socket类的close方法,目的是当用户关闭socket的时候,我们并不关闭它只是放在连接池内部。
package com.tarena.socketpool;
import Java.net.*;
import java.io.IOException;
/**
* <p>socket连接的简单实现</p>
* <p>Description: </p>
* <p>Copyright: Copyright Tarena(c) 2005</p>
* <p>Company: Tarena</p>
* @author chengxing
* @version 1.0
*/
public class ConnectionAdapter extends Socket{
/**
* 连接状态
*/
private boolean status=true;
/**
* 默认的构造函数
*/
public ConnectionAdapter() {
super();
}
public ConnectionAdapter(String host,int port)throws UnknownHostException,IOException{
super(host,port);
}
/**
* 判断此连接是否空闲
* @return boolean 空闲返回ture,否则false
*/
public boolean isFree(){
return status;
}
/**
* 当使用此连接的时候设置状态为false(忙碌)
*/
public void setBusy(){
this.status=false;
}
/**
* 当客户端关闭连接的时候状态设置为true(空闲)
*/
public void close(){
System.out.println("Close : set the status is free " );
status=true;
}
public void destroy(){
//Close socket connection
close();
// System.out.println("Close success " );
}
}
第二个类连接管理器。
package com.tarena.socketpool;

import java.lang.reflect.*;
import java.util.Properties;
/**
* <p>连接管理器</p>
* <p>Copyright: Copyright Tarena(c) 2005</p>
* <p>Company: Tarena</p>
* @author chengxing
* @version 1.0
*/
public class ConnectionManager {
//测试程序默认的连接池实现类
public static final String PROVIDER_CLASS="com.tarena.socketpool.MyConnectionProvider";
//测试程序的默认ip
public static final String HOST="127.0.0.1";
//测试程序的默认端口号
public static final String PORT="9880";
/**
* 注册钩子程序的静态匿名块
*/
static {
//增加钩子控制资源的释放周期
Runtime runtime = Runtime.getRuntime();
Class c = runtime.getClass();
try {
Method m = c.getMethod("addShutdownHook", new Class[] { Thread.class } );
m.invoke(runtime, new Object[] { new ShutdownThread() });
}
catch (NoSuchMethodException e) {
e.printStackTrace();
// Ignore -- the user might not be running JDK 1.3 or later.
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 默认的构造函数
*/
public ConnectionManager() {
}
/**
* 得到并初始化一个连接池
* 连接池的实现类通过系统参数来传递进来,通过命令行-DConnectionProvider=YourImplClass
* 如果没有指定的实现的话,则采用系统默认的实现类
* 通过命令行传入的参数列表如下
* 对方主机名-DHost=192.168.0.200
* 对方端口号 -DPort=9880
* 最小连接数 -DMax_size=10
* 最大连结数 -DMin_size=20
* 以上的值可以改变,但是参数不能改变,
* 最大连结数和最小连接数可以省略,默认值分别为20和10
* @return ConnectionProvider
*/
public static ConnectionProvider getConnectionProvider()throws Exception{
String provider_class=System.getProperty("ConnectionProvider");
if(provider_class==null)provider_class=PROVIDER_CLASS;

String host=System.getProperty("Host");
if(host==null)host=HOST;

String port=System.getProperty("port");
if(port==null)port=PORT;

String max_size=System.getProperty("Max_size");
String min_size=System.getProperty("Min_size");

Properties pro=new Properties();
pro.setProperty(ConnectionProvider.SERVER_IP,host);
pro.setProperty(ConnectionProvider.SERVER_PORT,port);
if(max_size!=null)pro.setProperty(ConnectionProvider.MAX_SIZE,max_size);
if(min_size!=null)pro.setProperty(ConnectionProvider.MIN_SIZE,min_size);
//通过反射得到实现类
System.out.println(provider_class);
System.out.flush();
Class provider_impl=Class.forName(provider_class);
//由于是单子模式,采用静态方法回调
Method m=provider_impl.getMethod("newInstance",new Class[]{java.util.Properties.class});
ConnectionProvider provider=null;
try{
provider = (ConnectionProvider) m.invoke(provider_impl, new Object[]{pro});
}catch(Exception e){
e.printStackTrace();
}

return provider;
}
/**
*
* <p>一个钩子的线程: 在程序结束的时候调用注销连接池</p>
* <p>Description: </p>
* <p>Copyright: Copyright Tarena(c) 2005</p>
* <p>Company: Tarena</p>
* @author chengxing

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在Win2003 Tomcat MySQL下运行JPetStore

下一篇:使用Struts的Token机制解决表单的重复提交