⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractconcurrentserver.java

📁 采用JAVA开发
💻 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 + -