2017-05-03 3 views
-1

Ich habe viele Beiträge zu diesem Fehler gesehen, aber finde keine richtige Lösung, die für mich arbeiten kann. Also poste ich es wieder.Verbindung Zeitüberschreitung Ausnahme beim Verbinden mit einem FTP-Server

Ich versuche, eine Datei auf ft.drivehq.com mit Apache Commons Bibliothek hochladen. Ich habe viele Lösungen wie Firewall-Einstellungen usw. versucht. Keine dieser Lösungen funktioniert.

Dies ist der Code, der den Dateinamen aus dem Formularfeld übernimmt und die Methoden ftp connect und upload file aufruft.

Dies ist die Klasse mit der Verbindungsmethode und Upload und Download von Dateimethoden. Verwenden Sie nicht den tatsächlichen Benutzernamen und das Passwort hier.

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

manchmal bekomme ich erros diese Aussage auch ..

OutputStream os = m_client.getOutputStream(); 

und dies ist das Fehlerprotokoll -

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) 

Ist das URL-Format korrekt? kann jemand mir bitte helfen ..

+2

[Warum kann "Kann mir jemand helfen?" Keine eigentliche Frage?] (Https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an- actual-question) –

+0

jetzt ist es in Ordnung ich denke .. –

Antwort

0

Welche Art von Bibliotheken verwenden Sie? Haben Sie versucht, org.apache.commons.net.ftp zu verwenden? Ist Ftp oder Ftps?

diese So versuchen:

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 

    } 
} 

Wenn dies nicht funktioniert, versuchen Sie eine Shell-Befehlszeile zu öffnen und verwenden „telnet host.com numPort“, wenn kein Fehler vorhanden ist, so vielleicht der Fehler das ist Ihr letzter Code, stattdessen gibt es einen Fehler, stellen Sie sicher, dass der Ausgabeport, zu dem Sie eine Verbindung herstellen möchten, in Ihrer Systemkonfiguration geöffnet ist.

+0

Funktioniert es? Können Sie bitte meine Antwort als "Akzeptanz" auswählen? danke –

+0

ja es hat geklappt .. –

Verwandte Themen