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

📄 requesthandler.java

📁 用java写的ftp服务器程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     */
    protected void notifyObserver() {
        m_request.updateLastAccessTime();
        m_fconfig.getConnectionManager().updateConnection(this);
    }

    /**
     * Execute the ftp command.
     */
    public void service(FtpRequestImpl request, FtpWriter out) throws IOException, FtpException {
        try {
            Command command = (Command)COMMAND_MAP.get( request.getCommand() );
            if(command != null) {
                command.execute(this, request, out);
            }
            else {
                out.send(502, "not.implemented", null);
            }
        }
        catch(Exception ex) {
            
            // send error reply
			m_log.warn("error:"+ ex.getMessage());
            try { 
                out.send(550, null, null);
            }
            catch(Exception ex1) {
            }
            
            if (ex instanceof java.io.IOException) {
               throw (IOException)ex;
            }
            else {
                m_log.warn("RequestHandler.service()", ex);
            }
        }
    }
    
    /**
     * Close connection. This is called by the connection service.
     */
    public void close() {
        
        // check whether already closed or not
        synchronized(this) {
            if(m_isConnectionClosed) {
                return;
            }
            m_isConnectionClosed = true;
        }
        
        // call Ftplet.onDisconnect() method.
        try {
            Ftplet ftpletContainer = m_fconfig.getFtpletContainer();
            ftpletContainer.onDisconnect(m_request, m_writer);
        }
        catch(Exception ex) {
            m_log.warn("RequestHandler.close()", ex);
        }

        // notify statistics object and close request
        IFtpStatistics ftpStat = (IFtpStatistics)m_fconfig.getFtpStatistics();
        FtpRequestImpl request = m_request;
        if(request != null) {
            
            // log message
            String userName = request.getUser().getName();
            InetAddress clientAddr = request.getRemoteAddress(); 
            m_log.info("Close connection : " + clientAddr.getHostAddress() + " - " + userName);
            
            // logout if necessary and notify statistics
            if(request.isLoggedIn()) {
                request.setLogout();
                ftpStat.setLogout(this);
            }
            ftpStat.setCloseConnection(this);
            
            // clear request
            request.clear();
            request.setObserver(null);
            request.getFtpDataConnection().dispose();
            FileSystemView fview = request.getFileSystemView();
            if(fview != null) {
            	fview.dispose();
            }
            m_request = null;
        }
                
        // close ftp writer
        FtpWriter writer = m_writer;
        if(writer != null) {
            writer.setObserver(null);
            writer.close();
            m_writer = null;
        }
        
        // close buffered reader
        BufferedReader reader = m_reader;
        if(reader != null) {
            IoUtils.close(reader);
            m_reader = null;
        }
        
        // close control socket
        Socket controlSocket = m_controlSocket;
        if (controlSocket != null) {
            try {
                controlSocket.close();
            }
            catch(Exception ex) {
                m_log.warn("RequestHandler.close()", ex);
            }
            m_controlSocket = null;
        }
    }

    /**
     * Check user permission to execute ftp command. 
     */
    protected boolean hasPermission() {
        String cmd = m_request.getCommand();
        if(cmd == null) {
            return false;
        }
        return m_request.isLoggedIn() ||
        cmd.equals("USER")            || 
        cmd.equals("PASS")            ||
        cmd.equals("AUTH")            ||
        cmd.equals("HELP")            ||
        cmd.equals("SYST")            ||
        cmd.equals("FEAT")            ||
        cmd.equals("PBSZ")            ||
        cmd.equals("PROT")            ||
        cmd.equals("LANG")            ||
        cmd.equals("QUIT");
    }    
    
    /**
     * Transfer data.
     */
    public final long transfer(BufferedInputStream in, 
                               BufferedOutputStream out,
                               int maxRate) throws IOException {
        
        boolean isAscii = m_dataType == DataType.ASCII;
        long startTime = System.currentTimeMillis();
        long transferredSize = 0L;
        byte[] buff = new byte[4096];
        
        while(true) {
            
            // if current rate exceeds the max rate, sleep for 50ms
            if(maxRate > 0) {
                
                // prevent "divide by zero" exception
                long interval = System.currentTimeMillis() - startTime;
                if(interval == 0) {
                    interval = 1;
                }
                
                // check current rate
                long currRate = (transferredSize*1000L)/interval;
                if(currRate > maxRate) {
                    try { Thread.sleep(50); } catch(InterruptedException ex) {break;}
                }
            }
            
            // read data
            int count = in.read(buff);
            if(count == -1) {
                break;
            }
            
            // write data
            // if ascii, replace \n by \r\n
            if(isAscii) {
                for(int i=0; i<count; ++i) {
                    byte b = buff[i];
                    if(b == '\n') {
                        out.write('\r');
                    }
                    out.write(b);
                }
            }
            else {
                out.write(buff, 0, count);
            }
            
            transferredSize += count;
            notifyObserver();
        }
        
        return transferredSize;
    }       
    
    /**
     * Create secure socket.
     */
    public void createSecureSocket(String protocol) throws Exception {
        
        // change socket to SSL socket
        ISsl ssl = m_fconfig.getDataConnectionConfig().getSSL();
        if(ssl == null) {
            throw new FtpException("Socket factory SSL not configured");
        }
        Socket ssoc = ssl.createSocket(protocol, m_controlSocket, false);
        
        // change streams
        m_reader = new BufferedReader(new InputStreamReader(ssoc.getInputStream(), "GB2312"));//GB2312 UTF-8
        m_writer.setControlSocket(ssoc);
        
        // set control socket
        m_controlSocket = ssoc;
    }
    
    /////////////////////////////////////////////////////////////////////
    static {
        COMMAND_MAP.put("ABOR", new org.apache.ftpserver.command.ABOR());
        COMMAND_MAP.put("ACCT", new org.apache.ftpserver.command.ACCT());
        COMMAND_MAP.put("APPE", new org.apache.ftpserver.command.APPE());
        COMMAND_MAP.put("AUTH", new org.apache.ftpserver.command.AUTH());
        COMMAND_MAP.put("CDUP", new org.apache.ftpserver.command.CDUP());
        COMMAND_MAP.put("CWD",  new org.apache.ftpserver.command.CWD());
        COMMAND_MAP.put("DELE", new org.apache.ftpserver.command.DELE());
        COMMAND_MAP.put("EPRT", new org.apache.ftpserver.command.EPRT());
        COMMAND_MAP.put("EPSV", new org.apache.ftpserver.command.EPSV());
        COMMAND_MAP.put("FEAT", new org.apache.ftpserver.command.FEAT());
        COMMAND_MAP.put("HELP", new org.apache.ftpserver.command.HELP());
        COMMAND_MAP.put("LANG", new org.apache.ftpserver.command.LANG());
        COMMAND_MAP.put("LIST", new org.apache.ftpserver.command.LIST());
        COMMAND_MAP.put("MDTM", new org.apache.ftpserver.command.MDTM());
        COMMAND_MAP.put("MLST", new org.apache.ftpserver.command.MLST());
        COMMAND_MAP.put("MKD",  new org.apache.ftpserver.command.MKD());
        COMMAND_MAP.put("MLSD", new org.apache.ftpserver.command.MLSD());
        COMMAND_MAP.put("MODE", new org.apache.ftpserver.command.MODE());
        COMMAND_MAP.put("NLST", new org.apache.ftpserver.command.NLST());
        COMMAND_MAP.put("NOOP", new org.apache.ftpserver.command.NOOP());
        COMMAND_MAP.put("OPTS", new org.apache.ftpserver.command.OPTS());
        COMMAND_MAP.put("PASS", new org.apache.ftpserver.command.PASS());
        COMMAND_MAP.put("PASV", new org.apache.ftpserver.command.PASV());
        COMMAND_MAP.put("PBSZ", new org.apache.ftpserver.command.PBSZ());
        COMMAND_MAP.put("PORT", new org.apache.ftpserver.command.PORT());
        COMMAND_MAP.put("PROT", new org.apache.ftpserver.command.PROT());
        COMMAND_MAP.put("PWD",  new org.apache.ftpserver.command.PWD());
        COMMAND_MAP.put("QUIT", new org.apache.ftpserver.command.QUIT());
        COMMAND_MAP.put("REIN", new org.apache.ftpserver.command.REIN());
        COMMAND_MAP.put("REST", new org.apache.ftpserver.command.REST());
        COMMAND_MAP.put("RETR", new org.apache.ftpserver.command.RETR());
        COMMAND_MAP.put("RMD",  new org.apache.ftpserver.command.RMD());
        COMMAND_MAP.put("RNFR", new org.apache.ftpserver.command.RNFR());
        COMMAND_MAP.put("RNTO", new org.apache.ftpserver.command.RNTO());
        COMMAND_MAP.put("SITE", new org.apache.ftpserver.command.SITE());
        COMMAND_MAP.put("SIZE", new org.apache.ftpserver.command.SIZE());
        COMMAND_MAP.put("STAT", new org.apache.ftpserver.command.STAT());
        COMMAND_MAP.put("STOR", new org.apache.ftpserver.command.STOR());
        COMMAND_MAP.put("STOU", new org.apache.ftpserver.command.STOU());
        COMMAND_MAP.put("STRU", new org.apache.ftpserver.command.STRU());
        COMMAND_MAP.put("SYST", new org.apache.ftpserver.command.SYST());
        COMMAND_MAP.put("TYPE", new org.apache.ftpserver.command.TYPE());
        COMMAND_MAP.put("USER", new org.apache.ftpserver.command.USER());
    }
}

⌨️ 快捷键说明

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