xiyou 发表于 2017-2-1 08:39:34

SOCKET监听随TOMCAT启动而启动

  SOCKET监听随TOMCAT启动而启动[转载]
支持pool的连接

web.xml
  <!-- Socket服务 start -->
   <context-param>
      <param-name>socketPort</param-name>
      <param-value>2009</param-value>
   </context-param>
   <listener>
      <description>Socket服务随web启动而启动</description>
      <listener-class>org.ljk.socket.listener.ServerSocketListener</listener-class>
   </listener>
      <!-- Socket服务 end -->


public class ServerSocketListener implements ServletContextListener {

   public void contextInitialized(ServletContextEvent event) {

      String part = event.getServletContext().getInitParameter("socketPort");
      String maxConcent="5";
      event.getServletContext().log("++++++++++++++++++++++++++++++++");
      event.getServletContext().log("++++ Socket服务随web启动而启动 ++++");
      event.getServletContext()
            .log("++++++++++++++++++++++++++++++++" + part);

      new ServerSocketStart(Integer.parseInt(part),Integer.parseInt(maxConcent)).start();
      event.getServletContext().log("++++ Socket服务已经启动完毕 ++++");
      
      
   }

   public void contextDestroyed(ServletContextEvent event) {

   }
}


public class ServerSocketStart extends Thread {
   private int port;
   private int maxConnections;
   public ServerSocketStart(int aListenPort, int maxConnections){
      this.port=aListenPort;
      this.maxConnections=maxConnections;
   }
   public void run() {
      ServerSocketFactory serverSocketFactory=ServerSocketFactory.getDefault();
      try {
         ServerSocket serverSocket=serverSocketFactory.createSocket(port);
         Socket request = null;
         System.out.println("++++++ ServerSocket已经启动 ++++++");
         this.setUpHandlers();
           while(true) {
               
              request = serverSocket.accept();
              System.out.println("++++++ 客户请求成功 ++++++");
              //接收客户机连接请求
                 PooledConnectionHandler.processRequest(request);
           }
      } catch (IOException e) {
         e.printStackTrace();
      } catch (InstantiationException e) {
         e.printStackTrace();
      }
   }

   
   public void setUpHandlers() {
       for(int i=0; i<maxConnections; i++) {
           PooledConnectionHandler currentHandler = new PooledConnectionHandler();
           System.out.println("++++++ Thread-Handler"+i+"已启动 ++++++");
           new Thread(currentHandler, "Handler " + i).start();
       }
   }
}


public class PooledConnectHandler implements Runnable {

   protected Socket connection;
   @SuppressWarnings("unchecked")
   protected static List pool = new LinkedList();
   public PooledConnectHandler() {}
   public voidhandleConnection() {
         System.out.println("客户:"+connection.getInetAddress()+"在时间:"+Calendar.getInstance().getTime().toString()+"访问过!");
       try {
           PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());
           BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
           String fileToRead = streamReader.readLine();
           BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
           String line = null;
           while((line=fileReader.readLine())!=null)
               streamWriter.println(line);
           fileReader.close();
           streamWriter.close();
           streamReader.close();
       }
       catch(FileNotFoundException e) {
           e.printStackTrace();
       }
       catch(IOException e) {
          e.printStackTrace();
       }
   }
   public static void processRequest(Socket requestToHandle) {
       synchronized(pool) {
           pool.add(pool.size(), requestToHandle);
           pool.notifyAll();
       }
   }
   public void run() {
       while(true) {
           synchronized(pool) {
               while(pool.isEmpty()) {
                   try {
                       pool.wait();
                   }
                   catch(InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               connection= (Socket)pool.remove(0);
           }
           handleConnection();
       }
   }


}
页: [1]
查看完整版本: SOCKET监听随TOMCAT启动而启动