public boolean isLimit(long guestid) {
boolean flag = true;
if (isLogin(guestid)) {
update(guestid);
flag = isLimit();
if (flag) {
if (guestid > 0 && limitGuest == guestid)
flag = false;
}// end if(flag)
}
return flag;
}
/**
* 取得当前限制客户的标识(该标识是该管理器为客户分配的一个唯一标识)
*
* @return 返回当前限制客户的标识
*/
protected long getLimitGuest() {
return limitGuest;
}
/**
* 更新客户最近使用时间
*
* @param guestid
* 客户标识
*/
protected void update(long guestid) {
runThread();
Hashtable<String, String> guests = getGuests();
if (guests != null && guests.containsKey("" + guestid))
guests.put("" + guestid, ""
+ System.currentTimeMillis());
}
/**
* 运行监听线程
*/
protected void runThread() {
// 客户自动清理线程
if (autoCleanThread != null && !autoCleanThread.isAlive())
autoCleanThread = null;
if (autoCleanThread == null) {
autoCleanThread = new AutoCleanThread();
autoCleanThread.start();
}// end if (autoCleanThread == null)
}
/**
* 设置自动清理客户记录的间隔时间
*
* @param time
* 间隔时间(毫秒)
*/
public void setCleanInterval(long time) {
if (time > 0)
cleanInterval = time;
}
/**
* 取得自动清理客户记录的间隔时间
*
* @return 返回自动清理客户记录的间隔时间(毫秒)
*/
public long getCleanInterval() {
return cleanInterval;
}
/**
* 取得客户记录
*
* @return 返回客户记录。格式为<客户标识,最近访问时间>
*/
protected Hashtable<String, String> getGuests() {
if (guests == null)
guests = new Hashtable<String, String>();
return guests;
}
/**
* 输出错误信息
*
* @param err
*/
public abstract void trace(String err);
/**
* 自动清除超时的客户端的线程
*
*/
private class AutoCleanThread extends Thread {
public void run() {
trace("AutoCleanThread thread start runing...");
long interval = ONE_HOUR / 4L;
if (getCleanInterval() > 0)
interval = getCleanInterval();
while (autoCleanThread == this && getGuests().size() > 0) {
long time = System.currentTimeMillis()
- ONE_HOUR / 2L;
Enumeration<?> keys = getGuests().keys();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
if (key != null) {
long lasttime = Long.parseLong(getGuests()
.get(key));
if (time > lasttime)
// 超时
getGuests().remove(key);
}// end if (key != null)
}// end while (keys.hasMoreElements())
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
trace("error - " + e.toString());
}
}// end while (mobiles != null && mobiles.size() > 0)
trace("AutoCleanThread thread end...");
}
}
}
/**
* 通讯端口的客户端限制管理器的抽象类
* 该类继承自GuestManager类,增加了connect()、disconnect()等方法
*
* @author none
*
*/
public abstract class PortGuestManager extends GuestManager {
/**
* 连接
*
* @return 返回是否连接成功
*/
protected abstract boolean connect();
/**
* 断开
*
* @return 返回是否断开成功
*/
protected abstract boolean disconnect();
/**
* 是否已经连接
*
* @return 返回端口是否已经连接
*/
protected abstract boolean isConnected();
public long login() {
long guestid = -1L;
if (!isConnected())
connect();
if (isConnected())
guestid = super.login();
return guestid;
}
public boolean limit(long guestid) {
boolean flag = false;
if (isConnected())
flag = super.limit(guestid);
return flag;
}
public void logout(long guestid) {
super.logout(guestid);
Hashtable<String, String> guests = getGuests();
if (guests != null)
if (guests.size() <= 0)
disconnect();
}
public boolean isLimit(long guestid) {
boolean flag = true;
if (isConnected())
flag = super.isLimit(guestid);
return flag;
}
}
责任编辑:小草