📄 abstractconcurrentserver.java
字号:
package com.gctech.util.net;
import org.apache.log4j.Logger;
import java.net.ServerSocket;
import java.io.IOException;
import java.net.Socket;
import EDU.oswego.cs.dl.util.concurrent.Executor;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: gctech</p>
* @author 王红宝
* @version $Id: AbstractConcurrentServer.java,v 1.1.1.1 2004/04/21 09:30:42 wanghb Exp $
*/
public abstract class AbstractConcurrentServer implements Runnable{
//服务线程执行者
protected Executor excecutor;
//服务socket
private ServerSocket serverSocket = null;
//服务器端口
protected int port ;
//服务器名称
protected String serverName;
//启动次数
private int n = 1;
//最多重启次数
static final int MAX_RESTART_TIME = 10;
//是否运行flag
boolean running = true;
protected abstract SocketService createSocketService(Socket sock)
throws Exception;
public void close() throws IOException {
if ( serverSocket != null ){
serverSocket.close();
serverSocket = null;
running = false;
}
logger.info("服务器"+this.serverName+"关闭成功!");
}
public void run(){
try {
/**第n次启动初始化ServerSocket*/
if (serverSocket == null ) {
serverSocket = new ServerSocket(port);
logger.info("第"+n+"次启动服务["+serverName+"]在端口["+port+"]\t\t\t\t\t\t[成功]");
}
//创建服务线程
while (running) {
//接收请求
Socket sock = serverSocket.accept();
//创建服务
try {
SocketService service = createSocketService(sock);
service.setSocket(sock);
/**启动子线程*/
excecutor.execute(service);
}
catch (Throwable ex3) {
logger.error(ex3, ex3);
}
}
}catch (Throwable ex) {
logger.error(ex, ex);
}finally {
if ( serverSocket != null ){
try {
serverSocket.close();
}
catch (Throwable ex1) {
logger.error(ex1, ex1);
}finally{
serverSocket = null;
}
}
logger.info("第"+n+"次结束服务"+this.serverName+"\t\t\t\t\t\t[成功]");
//大于等于最多重启次数
if ( n >= MAX_RESTART_TIME ){
logger.warn("服务器超过最多重启次数,关闭成功!");
}else{
n++;
try {
Thread.sleep( (2 ^ n) * 100);
}
catch (InterruptedException ex2) {
ex2.printStackTrace();
}
if ( running )
run();
}
}
}
public void setExcecutor(Executor excecutor) {
this.excecutor = excecutor;
}
static final Logger logger = Logger.getLogger(ConcurrentServer.class);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -