Java 连接到ftp服务器时出现连接超时异常

Java 连接到ftp服务器时出现连接超时异常,java,ftp,Java,Ftp,我已经看过很多关于这个错误的帖子,但是没有找到适合我的解决方案。 所以我再次发布它 我正在尝试使用apache commons库在ft.drivehq.com上传一个文件。我尝试过许多解决方案,如防火墙设置等。这些解决方案都不起作用 这是从表单字段获取文件名并调用ftp connect方法和upload file方法的代码 protected void processRequest(HttpServletRequest request, HttpServletResponse response)

我已经看过很多关于这个错误的帖子,但是没有找到适合我的解决方案。 所以我再次发布它

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

这是从表单字段获取文件名并调用ftp connect方法和upload file方法的代码

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);
    }



}
有时我在这句话上也会犯错误

 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)
URL格式正确吗?
谁能帮帮我吗

您使用的是哪种库?您是否尝试过使用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”,因此,可能错误是您的最后一个代码,而不是有错误,请确保您要连接的输出端口在系统配置中打开。

我想现在可以了。它可以工作了吗?你能选择我的答案为“接受”吗?谢谢,它起作用了。。
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  

    }
}