[ strain @ 20.03.2013. 09:41 ] @
Pozdrav,

imam zadatak da napravim FTP client u Javi. Ne smem da koristim postojece implementacije samog FTP protokola, ali mogu da implementariam deo FTP protokola koji je potreban da bi se izvrsile osnovne FTP operacije koje program zahteva (FTP logovanje i FTP transfer datoteka).

Prvo mi nije jasno sta ovo znaci, odnosno sta smem da koristim a sta ne?

Druga stvar je to samo logovanje. Ja uspostavim vezu sa serverom pomocu ovog bloka ali kako da se ja ulogujem, sta treba da koristim da bi prosledio svoje podatke serveru radi logovanja i kasnije da pozove metodu koja ce da posalje neki file na njega.

Code:

        try {
            sock = new Socket(server, 21);
            System.out.println("Connected to " + server);
            FileInputStream fis = new FileInputStream(largeFile);
            OutputStream os = sock.getOutputStream();
            byte[] buffer = new byte[buffer_size];
        } catch(IOException e){
            System.err.println(e.getMessage());
            System.exit(1);
        }



za sada mi je cilj da se ulogujem na server i da posaljem jedan file. Posle toga cu da radim dalje odnosno treba dalje da implementiram da mogu istovremeno da posaljem do 5 file-ova (ja sam mislio preko Thread-ova) i da izvlacim neku statistiku odnosno koliko je vremena trebalo da se to uploaduje, prosecno vreme, brzina prenosa.

Svaka pomoc bi mi dobrodosla. Malo mi je konfuzna ova sama konekcija sa serverom. Ja sam radio nesto slicno kao skolski zadatak ali smo pisali i server i onda je mnogo lakse uklopiti sa clienta saljem jedan file ovamo ga prima server i odgovara. A nisam nikada pisao nista za postojeci server. Inace server sam napravio FileZila Server sa ip adresom i user i pass.
[ bgd2500 @ 20.03.2013. 11:55 ] @
Pogledaj specifikaciju FTP protokola, pa ces videti koje komande mozes da saljes i sta dobijas kao odgovor na njih.
http://www.w3.org/Protocols/rfc959/4_FileTransfer.html
[ strain @ 20.03.2013. 16:01 ] @
Meni je problem kako da uradim logovanje korisnika. Dodje do ovog koda na filezilla serveru i ceka autentifikaciju odnosno stoji na Connecting to i posle nekog vremena pukne.

Kako ja da posaljem filezille-i korisnicke podatke da on verifikuje i posle primi file?

Code:

Socket sock = null;
            try {
                sock = new Socket(server, 21);
                System.out.println("Connecting to " + server.toString());
                
                
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
[ bantu @ 20.03.2013. 16:03 ] @
Prije nego sto ista krenes telnet-om ili nekim drugim programom se povezi na taj server po portu 21 i onda rucno mozes da kucas komande. Kada skontas kako komuniciras sa serverom onda lako implementujes taj protokol.
[ strain @ 20.03.2013. 16:14 ] @
A kako da posaljem serveru komandu iz jave.

Kako ide prosta komanda npr komandu za user name?
[ bantu @ 21.03.2013. 12:02 ] @
Moraš malo više da se potrudiš. Treba prvenstveno da proučiš ftp protokol i rad sa java socket-ima i input i output stream-ovim, te sa thread-ovima ukoliko želiš da napraviš ozbiljnu mrežnu aplikaciju. Evo primjer za ono sto si trazio, probaj pa dalje nastavi sam, ako zapne negdje a ti pitaj.

Code:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class FtpClient {

    public static void main(String[] args) {

        Socket clientSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        

        try {
            clientSocket = new Socket("ftp.mozilla.org", 21);
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));            

            String serverOutput;
            

            while ((serverOutput = in.readLine()) != null) {
                
                System.out.println("Server: " + serverOutput);            
                
                if (serverOutput.contains("Bye")) {
                    break;
                } else if (serverOutput.contains("550 Permission denied.")) {
                    out.println("USER anonymous");
                } else if (serverOutput.contains("331 Please specify the password.")) {
                    out.println("PASS [email protected]");
                } else if (serverOutput.contains("230 Login successful.")) {
                    out.println("PWD");                    
                 }                

            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        } finally {
            out.close();
            try {
                in.close();
                
                clientSocket.close();
            } catch (IOException e) {                
                e.printStackTrace();
            }
            
        }

    }
}
[ strain @ 21.03.2013. 15:10 ] @
Ok hvala na odgovoru. Posvetio sam se dosta dokumentaciji i nekim primerima sa interneta tako da polako resavam kada bude neki ozbiljan napredak okacicu kod.

Imam jedno pitanje da li neko zna sta znaci active i pasive transfer mode i nacin slanja binary ili ascii nije mi bas jasno sta je sta tu i da li to treba da implementiram.
[ strain @ 21.03.2013. 21:58 ] @
Napredujem lepo sa ovim FTP Clientom mogu vam reci i dosta su mi pomogli saveti da vise obratim paznju na FTP dokumentaciju kao i ovo sto je bantu napisao.

Sada imam novi problem.

Kada prebacujem file sa client-a na server ako taj file ne postoji na serveru sve prodje extra, ali ako postoji javi se greska 550 Premission denied, ja obrisem sa servera probam ponovo radi ali ako pokrenem ponovo a file je vec na serveru opet greska.

Kod sa kojim kopiram file je sledeci:

Code:

public void dataTransfer(String path) {
        String resp;
        /* send the file */
        out.println("STOR " + path);

        resp = getResponse();

        BufferedInputStream bis;
        int bytesRead;
        byte[] buffer = new byte[1024];
        try {
            bis = new BufferedInputStream(new FileInputStream(path));

            for (bytesRead = bis.read(buffer); bytesRead >= 0; bytesRead = bis.read(buffer)) {
                passiveOut.write(buffer, 0, bytesRead);
            }

        } catch (IOException e) {
            System.err.println("Error writting file: " + e.getMessage());
        }
        System.out.println("Data transfer");
    }


dok je deo main klase koja sve to pokrece

Code:

    public Main() {

        userName = "marko";
        password = "marko";
        server = "127.0.0.1";
        file = "text.txt";

        connection = new FtpConnection(server);
        if (connection.isAlive()) {
            connection.user(userName);
            while (!connection.getResponse().startsWith("331")) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            connection.pass(password);

            connection.setupTransferMode(server);
            connection.dataTransfer(file);
            
            connection.closeTransferMode();
        }
    }

vrednosti za user, password, server i file sam stavio zbog testiranja oni ce se ucitavati u zavisnosti od toga sta korisnik unese.

Zbog cega mi se javlja greska 550 kada file vec postoji, a koliko sam video u dokumentaciji komanda STOR snima podatke preko file-a ako vec postoji.

Citat:

STORE (STOR)

This command causes the server-DTP to accept the data
transferred via the data connection and to store the data as
a file at the server site. If the file specified in the
pathname exists at the server site, then its contents shall
be replaced by the data being transferred. A new file is
created at the server site if the file specified in the
pathname does not already exist.