【问题标题】:connection timed out exception while connecting to a ftp server [duplicate]连接到 ftp 服务器时连接超时异常[重复]
【发布时间】:2017-05-24 16:02:10
【问题描述】:

我看过很多与此错误相关的帖子,但找不到任何适合我的解决方案。 所以我再发一次。

我正在尝试使用 apache commons 库在 ft.drivehq.com 上上传文件。我尝试了许多解决方案,例如防火墙设置等。这些解决方案都不起作用。

这是从表单字段中获取文件名并调用ftp连接方法和上传文件方法的代码。

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    ismultipart = ServletFileUpload.isMultipartContent(request);

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    if(!ismultipart)
    {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>servlet upload</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>no file upload</p>");
        out.println("</body>");
        out.println("</html>");
        return;

    }

    DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
    fileItemFactory.setSizeThreshold(1 * 1024 * 1024);
    fileItemFactory.setRepository(new File(TMP_DIR_PATH));

    ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);

    Connection con = null;
    PreparedStatement pstm = null;
    PreparedStatement pstm1 = null;
    PreparedStatement pstm2 = null;
    PreparedStatement pstm3 = null;

    try {
        /*
         * Parse the request
         */
        con = Dbconnector.getConnection();
        List items = uploadHandler.parseRequest(request); 
        Iterator itr = items.iterator();
        String fileName = "";
        FileItem item = (FileItem) itr.next();
        System.out.println("item "+item);
        String fName = item.getName();
        System.out.println("fname " + fName);

       fileName = (String) item.getName();       
        System.out.println("filename " + fileName);    


        int x = fileName.lastIndexOf('\\');
        String fN = fileName.substring(x + 1, fileName.length());
        System.out.println(fN);
        SimpleFTPClient client = null;

        \\table to retrieve drivehq login details
        String sq1 = "select * from adserver"; 

        pstm3 = con.prepareStatement(sq1);
        ResultSet rs1 = pstm3.executeQuery();
        String user = "";
        String cld = "";
        while (rs1.next()) {
            client = new SimpleFTPClient();
            cld = rs1.getString("host_name");
            user = rs1.getString("username");
            client.setHost(rs1.getString("host_name"));
            client.setUser(rs1.getString("username"));
            client.setPassword(rs1.getString("password"));
            client.setRemoteFile("pdp_cloud");
            client.setport(21);

            boolean log = client.connect();
            System.out.println(log);
            if (log) {
               if(client.uploadFile(item.getInputStream())) {

                    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + user);
                    String sq2 = "insert into upload (file_name,date,file_data)values(?,?,?)";
                    pstm1 = con.prepareStatement(sq2);
                    pstm1.setString(1, fileName);
                    //pstm1.setString(2, "not set");
                   // pstm1.setString(3, "not set");
                    pstm1.setString(2, dateNow);
                    pstm1.setBinaryStream(3, item.getInputStream(), item.getSize());
                    pstm1.execute();

                } else {
                   System.out.println(">>>>>>else");

                }
            } else {
                System.out.println("not connected");
            }

        }
        response.sendRedirect("CreateBlocks.html?msg=File Uploaded..");


    } catch (Exception ex) {
        ex.printStackTrace();
        response.sendRedirect("UploadFile.html?msg=Cloud Not Connected");
        // log("Error encountered while uploading file", ex);
    }



}

这是具有连接方法和上传和下载文件方法的类。此处未使用实际的用户名和密码。

     public class SimpleFTPClient {

    /** The URL connection object */
    private URLConnection m_client;
    /** The FTP host/server to be connected */
    private String host;
    /** The FTP user */
    private String user;
    /** The FTP user’s password */
    private String password;
    /** The remote file that needs to be uploaded or downloaded */
    private String remoteFile;
    /** The previous error message triggered after a method is called */
    private String erMesg;
    /** The previous success message after any method is called */
    private String succMesg;
    /**set port number */
    private int port;

    public SimpleFTPClient() {
    }

    /** Setter method for the FTP host/server */
    public void setHost(String host) {
        this.host = host;
    }

    /** Setter method for the FTP user */
    public void setUser(String user) {
        this.user = user;
    }

    /** Setter method for the FTP user’s password */
    public void setPassword(String p) {
        this.password = p;
    }

    /** Setter method for the remote file, this must include the sub-directory path relative
    to the user’s home directory, e.g you’e going to download a file that is within a sub directory
    called "sdir", and the file is named "d.txt", so you shall include the path as "sdir/d.txt"
     */
    public void setRemoteFile(String d) {
        this.remoteFile = d;
    }

    /** The method that returns the last message of success of any method call */
    public synchronized String getLastSuccessMessage() {
        if (succMesg == null) {
            return "";
        }
        return succMesg;
    }

    /** The method that returns the last message of error resulted from any exception of any method call */
    public synchronized String getLastErrorMessage() {
        if (erMesg == null) {
            return "";
        }
        return erMesg;
    }

    /**method to set port number for host */
    public void setport(int p)
    {
        this.port = p;
    }

    /** The method that handles file uploading, this method takes the absolute file path
    of a local file to be uploaded to the remote FTP server, and the remote file will then
    be transfered to the FTP server and saved as the relative path name specified in method setRemoteFile
    @param localfilename – the local absolute file name of the file in local hard drive that needs to
    FTP over
     */
   public synchronized boolean uploadFile(InputStream is) {
    //public synchronized boolean uploadFile(String localfilename) {
        try {

         //   InputStream is = new FileInputStream(localfilename);
            BufferedInputStream bis = new BufferedInputStream(is);
            OutputStream os = m_client.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(os);
            byte[] buffer = new byte[1024];
            int readCount;

            while ((readCount = bis.read(buffer)) > 0) {
                bos.write(buffer, 0, readCount);
            }
            bos.close();

            this.succMesg = "Uploaded!";

            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            StringWriter sw0 = new StringWriter();
            PrintWriter p0 = new PrintWriter(sw0, true);
            ex.printStackTrace(p0);
            erMesg = sw0.getBuffer().toString();

            return false;
        }
    }

    /** The method to download a file and save it onto the local drive of the client in the specified absolut path
    @param localfilename – the local absolute file name that the file needs to be saved as */
    public synchronized boolean downloadFile(String localfilename) {
        try {
            InputStream is = m_client.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            System.out.println(">>>>>>>>>>>"+localfilename);
            OutputStream os = new FileOutputStream(localfilename);
            BufferedOutputStream bos = new BufferedOutputStream(os);

            byte[] buffer = new byte[1024];
            int readCount;

            while ((readCount = bis.read(buffer)) > 0) {
                bos.write(buffer, 0, readCount);
            }
            bos.close();
            is.close(); // close the FTP inputstream
            this.succMesg = "Downloaded!";

            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            StringWriter sw0 = new StringWriter();
            PrintWriter p0 = new PrintWriter(sw0, true);
            ex.printStackTrace(p0);
            erMesg = sw0.getBuffer().toString();

            return false;
        }
    }

    /** The method that connects to the remote FTP server */
    public synchronized boolean connect() {
        try {
            URL url = new URL("ftp://" + user + ":" + password + "@" + host + ":" + port + "/" + remoteFile);
            m_client = url.openConnection();
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.."+"ftp://" + user + ":" + password + "@" + host + "/" + remoteFile);
            return true;

        } catch (Exception ex) {
            ex.printStackTrace();
            StringWriter sw0 = new StringWriter();
            PrintWriter p0 = new PrintWriter(sw0, true);
            ex.printStackTrace(p0);
            erMesg = sw0.getBuffer().toString();
            return false;
        }
    }

有时我也会在这句话上出错..

 OutputStream os = m_client.getOutputStream();

这是错误日志 -

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.ftp.impl.FtpClient.doConnect(Unknown Source)
    at sun.net.ftp.impl.FtpClient.tryConnect(Unknown Source)
    at sun.net.ftp.impl.FtpClient.connect(Unknown Source)
    at sun.net.ftp.impl.FtpClient.connect(Unknown Source)
    at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.ftp.FtpURLConnection.getOutputStream(Unknown Source)
    at pdp_cloud.SimpleFTPClient.uploadFile(SimpleFTPClient.java:87)
    at pdp_cloud.UploadFile.processRequest(UploadFile.java:161)
    at pdp_cloud.UploadFile.doPost(UploadFile.java:223)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

网址格式是否正确? 谁能帮帮我..

【问题讨论】:

标签: java ftp


【解决方案1】:

您使用的是哪种库?您是否尝试过使用 org.apache.commons.net.ftp?是 Ftp 还是 Ftps?

所以试试这个:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
public class FTPMain {
 FTPClient ftp = null;

public FTPMain(){

    }

    public Object mainFTP() throws Exception {

        try{

            initFTPUploader("myhost.com", "user", "pass", 8080);
            disconnect();
        }catch(Exception e){
            String msg = "Error";
        }

        return "disconnect";
    }
    public  void initFTPUploader(String host, String user, String pwd,int numPort) throws Exception {
        ftp= new FTPClient(); //use new FTPSClient if is FTPS
        ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
        int reply;
        ftp.connect(host, numPort);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            throw new Exception("Exception in connecting to FTP Server");
        }
        ftp.enterLocalPassiveMode();
        ftp.login(user, pwd);
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        ftp.printWorkingDirectory();
        ftp.changeWorkingDirectory("/myDirectory");
        ftp.printWorkingDirectory();
       //ftp.execPBSZ(0);// use this two only if is a ftps connection  
       //ftp.execPROT("P");// use this two only if is a ftps connection  

    }
}

如果这不起作用,请尝试打开 shell 命令行并在没有错误的情况下使用“telnet host.com numPort”,所以错误可能是您的最后一个代码,而不是有错误,请确保您要连接的输出端口在您的系统配置中处于打开状态。

【讨论】:

  • 有效吗?您可以选择我的答案为“接受”吗?谢谢
  • 是的,它有效..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2010-12-09
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多