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

📄 portlistener.java

📁 telnetD源代码
💻 JAVA
字号:
//License/*** * Java TelnetD library (embeddable telnet daemon) * Copyright (c) 2000-2005 Dieter Wimberger  * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. *   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE. ***/package net.wimpi.telnetd.net;import net.wimpi.telnetd.BootException;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.text.MessageFormat;import java.util.Properties;/** * Class that implements a <tt>PortListener</tt>.<br> * If available, it accepts incoming connections and passes them * to an associated <tt>ConnectionManager</tt>. * * @author Dieter Wimberger * @version 2.0 (13/03/2005) * @see net.wimpi.telnetd.net.ConnectionManager */public class PortListener    implements Runnable {  private static Log log = LogFactory.getLog(PortListener.class);  private String m_Name;  private int m_Port;							            //port number running on  private int m_FloodProtection;					    //flooding protection  private ServerSocket m_ServerSocket = null; //server socket  private Thread m_Thread;  private ConnectionManager m_ConnectionManager;	//connection management thread  private boolean m_Stopping = false;  private boolean m_Available;               		//Flag for availability  /**   * Constructs a PortListener instance.<br>   * Its private because its called by a factory method.   *   * @param port      int that specifies the port number of the server socket.   * @param floodprot that specifies the server socket queue size.   */  private PortListener(String name, int port, int floodprot) {    m_Name = name;    m_Available = false;    m_Port = port;    m_FloodProtection = floodprot;  }//constructor  /**   * Returns the name of this <tt>PortListener</tt>.   *   * @return the name as <tt>String</tt>.   */  public String getName() {    return m_Name;  }//getName  /**   * Tests if this <tt>PortListener</tt> is available.   *   * @return true if available, false otherwise.   */  public boolean isAvailable() {    return m_Available;  }//isAvailable  /**   * Sets the availability flag of this <tt>PortListener</tt>.   *   * @param b true if to be available, false otherwise.   */  public void setAvailable(boolean b) {    m_Available = b;  }//setAvailable  /**   * Starts this <tt>PortListener</tt>.   */  public void start() {    log.debug("start()");    m_Thread = new Thread(this);    m_Thread.start();    m_Available = true;  }//start  /**   * Stops this <tt>PortListener</tt>, and returns   * when everything was stopped successfully.   */  public void stop() {    log.debug("stop()::"+ this.toString());    //flag stop    m_Stopping = true;    m_Available = false;    //take down all connections    m_ConnectionManager.stop();    //close server socket    try {      m_ServerSocket.close();    } catch (IOException ex) {      log.error("stop()", ex);    }    //wait for thread to die    try {      m_Thread.join();    } catch (InterruptedException iex) {      log.error("stop()", iex);    }    log.info("stop()::Stopped " + this.toString());  }//stop  /**   * Listen constantly to a server socket and handles incoming connections   * through the associated {a:link ConnectionManager}.   *   * @see net.wimpi.telnetd.net.ConnectionManager   */  public void run() {    try {      /*          A server socket is opened with a connectivity queue of a size specified          in int floodProtection.  Concurrent login handling under normal circumstances          should be handled properly, but denial of service attacks via massive parallel          program logins should be prevented with this.      */      m_ServerSocket = new ServerSocket(m_Port, m_FloodProtection);      //log entry      Object[] args = {new Integer(m_Port), new Integer(m_FloodProtection)};      log.info(MessageFormat.format(logmsg, args));      do {        try {          Socket s = m_ServerSocket.accept();          if (m_Available) {            m_ConnectionManager.makeConnection(s);          } else {            //just shut down the socket            s.close();          }        } catch (SocketException ex) {          if (m_Stopping) {            //server socket was closed blocked in accept            log.debug("run(): ServerSocket closed by stop()");          } else {            log.error("run()", ex);          }        }      } while (!m_Stopping);    } catch (IOException e) {      log.error("run()", e);    }    log.debug("run(): returning.");  }//run  /**   * Returns reference to ConnectionManager instance associated   * with the PortListener.   *   * @return the associated ConnectionManager.   */  public ConnectionManager getConnectionManager() {    return m_ConnectionManager;  }//getConnectionManager  /**   * Factory method for a PortListener instance, returns   * an instance of a PortListener with an associated ConnectionManager.   *   * @param settings Properties that contain all configuration information.   */  public static PortListener createPortListener(String name, Properties settings)      throws BootException {    PortListener pl = null;    try {      //1. read settings of the port listener itself      int port = Integer.parseInt(settings.getProperty(name + ".port"));      int floodprot = Integer.parseInt(settings.getProperty(name + ".floodprotection"));      if (new Boolean(settings.getProperty(name + ".secure")).booleanValue()) {        //do nothing for now, probably set factory in the future      }      pl = new PortListener(name, port, floodprot);    } catch (Exception ex) {      log.error("createPortListener()", ex);      throw new BootException("Failure while creating PortListener instance:\n" +          ex.getMessage());    }    //2. factorize a ConnectionManager, passing the settings, if we do not have one yet    if (pl.m_ConnectionManager == null) {      pl.m_ConnectionManager = ConnectionManager.createConnectionManager(name, settings);      try {        pl.m_ConnectionManager.start();      } catch (Exception exc) {        log.error("createPortListener()", exc);        throw new BootException("Failure while starting ConnectionManager watchdog thread:\n" +            exc.getMessage());      }    }    return pl;  }//createPortListener  private static final String logmsg =      "Listening to Port {0,number,integer} with a connectivity queue size of {1,number,integer}.";}//class PortListener

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -