Przesyłanie pliku przez FTP

Przesyłanie pliku przez FTP
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
0

Hej! Mam problem z wysłanie pliku na serwer FTP za pomocą aplikacji napisanej w Javie...
Rzuca mi wyjątek :
java.net.SocketTimeoutException: connect timed out

Kod klasy obsługującej operacje na FTP (znalazłem to w sieci):

Kopiuj
import java.io.*;
import java.net.*;


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;

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

  /** 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 (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)
    {
      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);

      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)
    {
      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+"/"+remoteFile+";type=i");
    //  URL url = new URL("ftp://"+user+":"+password+"@"+host); 

    m_client = url.openConnection();
        m_client.setConnectTimeout(5000);

    return true;

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

}
 

no i gdzieś w kodzie wykorzystuje tą klasę :)

Kopiuj
 
SimpleFTPClient f= new SimpleFTPClient ();
  f.setHost("ftp.friko.pl");
  f.setUser("jakistamadresprzykladowy.za.pl");
  f.setPassword("haslomaslo123");
  boolean connected=f.connect(); 
  
        f.setRemoteFile("test.txt");
if ( connected){
  if (f.uploadFile("c:" + File.separator + "test.txt"))
    // display the message of success if uploaded
  System.out.println(f.getLastSuccessMessage ());
  else
    System.out.println(f.getLastErrorMessage ());
  }
  else
  // Display any connection exception, if any
    System.out.println(f.getLastErrorMessage ()); 

Dodam, że przez przeglądarkę normalnie się dostaje...

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
0

A mógłbys mi to zdebugować dać zrzut stosu?? Będzie przynajmniej widać stos wywołań i generalnie w którym momencie (która linia kodu) wywala timeouta. Chociaż pewnie przy próbie zapisu do strumienia przy uploadzie. Daj ten stos.


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
0

Jeszcze małe info, Java to wersja 1.7 update 2, Netbeans 7.01.

Kopiuj
 
java.net.SocketTimeoutException: connect timed out
	at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
	at java.net.Socket.connect(Socket.java:579)
	at sun.net.ftp.impl.FtpClient.doConnect(FtpClient.java:938)
	at sun.net.ftp.impl.FtpClient.tryConnect(FtpClient.java:903)
	at sun.net.ftp.impl.FtpClient.connect(FtpClient.java:998)
	at sun.net.ftp.impl.FtpClient.connect(FtpClient.java:984)
	at sun.net.www.protocol.ftp.FtpURLConnection.connect(FtpURLConnection.java:294)
	at sun.net.www.protocol.ftp.FtpURLConnection.getOutputStream(FtpURLConnection.java:507)

Jak debuguje wygląda na to, że błąd jest przy metodzie uploadFile....klasy SimpleFTPClient :(

Antoniossss
kurde, zupełnie nie znam tej klasy. Tutaj jeszcze fajnie to widzę z debuga wygląda, bo nigdzie nie ma "korzennego" wywołania z klasy SimpleFtpClient :( ale zdaje się, że to się wysypuje przy OutputStream os =m_client.getOutputStream(); może zmień tego timeouta na 10 s (jakiś przypadek dziwny, że 5 s to mu za mało...) a może gdzieś tam tryb trzeba ustawić z aktywnego na pasywny czy coś w ten deseń? Z racji tego, że nie ma tu Twojego kodu to zdaje się pytanie byłoby do twórców tej klasy :( Jaka jest opcja, że samo logowanie się nie powiodło?)
LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
0

Tzn. wstawiłem kod tej klasy SimpleFTP...
A może ktoś zna inną metodę przesyłania przez FTP... Chyba nie powinno być to problemem do zaimplementowania w javie? Niby jest to język tworzony m.in z myślą o sieci, to nie powinno być problemów...

LO
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 4 lata
0

Przed chwilą próbowałem, ale niestety nie działa :( Rzuca taki wyjątek :

Kopiuj
 
Exception in thread "main" java.net.ConnectException: Connection timed out: connect
	at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
	at java.net.Socket.connect(Socket.java:579)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:168)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:189)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:278)

Dokładniej u mnie w kodzie na tej linijce :
ftpClient.connect("ftp.friko.pl");
:(
Z przeglądarki normalnie wchodzę na ten serwer FTP.
Spróbuje wieczorem uruchomić ten program na innym komputerze w innej sieci zupełnie...
Może coś jest zablokowane? Ale Java korzysta domyślnie z ustawień domyślnej przeglądarki jeśli chodzi o proxy..

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)