FTP (Protokol Transfer File Transfer File) adalah protokol yang digunakan untuk mentransfer file di Internet. File dapat diunggah (diunggah) atau diunduh (unduh) melalui server FTP di internet. FTP adalah layanan online real-time. Sebelum menggunakannya, itu harus menjadi pengguna (nama pengguna dan kata sandi) dengan layanan. Saat bekerja, klien harus terlebih dahulu masuk ke komputer yang merupakan server. Setelah masuk, pengguna dapat melakukan pencarian file dan transfer file dan operasi terkait lainnya, seperti mengubah direktori kerja saat ini, direktori file kolom, mengatur parameter transmisi dan transfer file, dll. Gunakan FTP untuk mentransfer semua jenis file, seperti file teks, file yang dapat dieksekusi, file gambar, file suara, dan file kompresi data.
Perintah FTP
Operasi utama FTP didasarkan pada berbagai perintah. Perintah yang umum digunakan adalah:
Mengatur mode transmisi, yang mencakup Mode Binary Binary Ascⅱ (Teks) dan Biner;
Operasi Direktori, Mengubah atau Menampilkan Direktori Saat Ini dari Komputer Jarak Jauh (Perintah CD, Dir/LS);
Operasi koneksi, perintah terbuka digunakan untuk membuat koneksi dengan komputer jarak jauh; Perintah tutup digunakan untuk menutup koneksi;
Kirim operasi, perintah put digunakan untuk mentransfer file ke komputer jarak jauh; Perintah put digunakan untuk mentransfer beberapa file ke komputer jarak jauh;
Dapatkan operasi, dapatkan perintah digunakan untuk menerima satu file; Perintah MGGET digunakan untuk menerima banyak file.
impor java.net.socket; impor org.apache.log4j.logger; /** * Peran - Server a * @author leon * */kelas publik servera {public static void main (string [] args) {string final f_dir = "c:/test"; // port int root port = 22; // mendengarkan nomor port logger.getrootlogger (); Logger logger = logger.getLogger ("com"); Coba {ServerSocket S = New ServerSocket (port); logger.info ("Menghubungkan ke server a ..."); logger.info ("Connected Success! Port lokal:"+s.getLocalport ()+". Direktori default: '"+f_dir+"'."); while (true) {// terima permintaan klien socket client = s.accept (); // Buat utas layanan klien baru (klien, f_dir) .start (); }} catch (Exception e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}}} import java.io.bufferedReader; impor java.io.file; impor java.io.filenotfoundException; impor java.io.ioException; impor java.io.inputstream; impor java.io.inputStreamReader; impor java.io.outputStream; impor java.io.printwriter; impor java.io.randomaccessfile; impor java.net.connectException; impor java.net.inetaddress; impor java.net.serversocket; impor java.net.socket; impor java.net.unknownhostException; impor java.nio.charset.charset; impor java.util.random; impor org.apache.log4j.logger; /** * Client subthread class* @author Leon * */ public class ClientThread extends Thread { private Socket socketClient;//Client socket private Logger logger;//Login object private String dir;//Absolute path private String pdir = "/";//Relative path private final static Random generator = new Random();//Random number public ClientThread(Socket client, String F_DIR){ this.socketClient = klien; this.dir = f_dir; } @Override public void run () {logger.getrootlogger (); logger = logger.getLogger ("com"); InputStream adalah = null; OutputStream OS = null; coba {is = socketclient.getInputStream (); os = socketclient.getoutputStream (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} BufferedReader BR = BufferedReader baru (inputStreamReader baru (IS, charset.forname ("UTF-8"))); Printwriter pw = printwriter baru (OS); String clientip = socketclient.getInetAddress (). ToString (). Substring (1); // Rekam klien ip string username = "tidak masuk"; // username string password = ""; // status kata sandi = ""; // command boolean loginstus = false; // status login_warning. " String str = ""; // Perintah Konten String int port_high = 0; int port_low = 0; String retr_ip = ""; // alamat IP dari soket file penerima tempsocket = null; // Cetak pesan selamat datang pw.println ("server 220-ftp A versi 1.0 yang ditulis oleh Leon Guo"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> terhubung, mengirim pesan selamat datang ..."); logger.info ("("+nama pengguna+") ("+clientip+")> server 220-ftp A versi 1.0 yang ditulis oleh Leon Guo"); boolean b = true; while (b) {coba {// dapatkan perintah yang dimasukkan oleh perintah pengguna = br.readline (); if (null == command) break; } catch (ioException e) {pw.println ("331 gagal mendapatkan perintah"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 331 gagal mendapatkan perintah"); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); } b = false; } /** Perintah kontrol akses* / // perintah pengguna if (command.touppercase (). Startswith ("user")) {logger.info ("(tidak masuk) ("+clientip+")>"+command); username = command.substring (4) .trim (); if ("". Equals (username)) {pw.println ("501 Sintaks Kesalahan"); pw.flush (); logger.info ("(tidak masuk) ("+clientip+")> 501 kesalahan sintaks"); nama pengguna = "tidak masuk"; } else {pw.println ("331 Kata sandi diperlukan untuk" + nama pengguna); pw.flush (); logger.info ("(tidak masuk) ("+clientip+")> 331 kata sandi yang diperlukan untuk"+nama pengguna); } loginstus = false; } // end user // command pass else if (command.touppercase (). startswith ("pass")) {logger.info ("(tidak masuk) ("+clientip+")>"+command); kata sandi = command.substring (4) .trim (); if (username.equals ("root") && password.equals ("root")) {pw.println ("230 login"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 230 login"); // logger.info ("klien"+clientip+"" login pengguna "); loginstus = true;} else {pw.println (" 530 login atau kata sandi salah! "); pw.flush (); lOGger.info (" (tidak login) ("+clientip+"); "no louger atau louger;" no louger; "no loure; } // end pass // perintah pwd lain if (command.touppercase (). startswith ("pwd")) {logger.info ("("+nama pengguna+") ("+clientip+")>"+command); pw.println ("257 /" "+pdir+" /"adalah direktori saat ini"); } else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end pwd // cwd command else if (command.touppercase (). startswith ("cwd")) {logger.info ("("+username+") ("+clientip+")>"+perintah); if (loginstus) {str = command.substring (3) .trim (); if ("". Equals (str)) {pw.println ("250 klien yang rusak terdeteksi, argumen yang hilang ke cwd. /" "+pdir+" /"adalah direktori saat ini."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 250 klien yang rusak terdeteksi, argumen yang hilang ke cwd./"+pdir+"/" adalah direktori saat ini. ");} else {// menilai apakah direktori (tmp) (ife) (ife) (ife (tmp) (ife (tmp) (ife (tmp) (ife (tmp) (ife) {{{ei) (tmp) (tmp. dir = "/"+str; direktori saat ini "); pw.flush (); Logger.info ("("+nama pengguna+") ("+clientip+")> 250 cwd berhasil./"+pdir+"/" adalah direktori saat ini ");} else {// direktori tidak ada pw.println (" 550 cwd gagal./""+PDIR+"":: ":"). logger.info ("("+nama pengguna+") ("+clientip+")> 550 CWD gagal. /"+Pdir+" /": Direktori tidak ditemukan. "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end cwd // command command lain if (command.touppercase (). startswith ("quit")) {logger.info ("("+username+") ("+clientip+")>"+command); b = false; pw.println ("221 Goodbye"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 221 selamat tinggal"); coba {thread.currentThread (); Thread.sleep (1000); } catch (InterruptedException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} // end QUIT /** PERMAINAN Parameter Parameter* // Perintah port, secara aktif mengirimkan data dalam mode lain jika (command.touppercase (). startswith ("port")) {logger.info ("("+nama pengguna+") ("+clientip+")>"+perintah); if (loginstuts) {coba {str = command.substring (4) .trim (); port_low = integer.parseint (str.substring (str.LastIndexOf (",")+1)); port_high = integer.parseint (str.substring (0, str.LastIndexOf (","))) .substring (str.substring (0, str.LastIndexOf (",")). LastIndexof (",")+1)); String str1 = str.substring (0, str.substring (0, str.LastIndexof (",")). LastIndexof (",")); retr_ip = str1.replace (",", "."); coba {// instantiate socket tempsocket dalam mode aktif = soket baru (retr_ip, port_high * 256 + port_low); // logger.info ("user"+clientip+":"+username+"jalankan perintah port"); pw.println ("200 perintah port berhasil"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 200 perintah port berhasil"); } catch (ConnectException CE) {pw.println ("425 tidak dapat membuka koneksi data."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 425 tidak dapat membuka koneksi data."); Logger.Error (ce.getMessage ()); untuk (StackTraceElement Ste: ce.getStackTrace ()) {logger.error (ste.toString ()); }} catch (unknownHostException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} catch (NumberFormateException e) {pw.println ("503 urutan perintah yang buruk."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 503 urutan perintah yang buruk."); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end port // perintah pasv, mode transfer mode pasif lain jika (command.touppercase (). startswith ("pasv")) {logger.info ("("+nama pengguna+") ("+clientip+")>"+perintah); if (loginstuts) {serversocket ss = null; while (true) {// Dapatkan port port free server port_high = 1 + generator.nextint (20); port_low = 100 + generator.nextint (1000); coba {// server binding ports ss = server baru (port_high * 256 + port_low); merusak; } catch (ioException e) {lanjutan; }} // logger.info ("user"+clientip+":"+username+"Execute Pasv command"); Inetaddress i = null; coba {i = inetaddress.getLocalHost (); } catch (unknownHostException e1) {e1.printstacktrace (); } pw.println ("227 Memasukkan mode pasif ("+i.getHostaddress (). REPLACE (".", ",")+","+port_high+","+port_low+")"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 227 Memasukkan mode pasif ("+i.getHostaddress (). Ganti (".", ",")+","+port_high+","+port_low+")"); coba {// soket tempsocket dalam mode pasif = ss.accept (); ss.close (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end pasv // retr perintah lain if (command.touppercase (). startswith ("retr")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 sintaks kesalahan"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 501 kesalahan sintaks"); } else {coba {pw.println ("150 saluran data pembuka untuk transfer file."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 150 Membuka saluran data untuk transfer file."); Outfile randomAccessFile = null; OutputStream outsocket = null; Coba {// Buat aliran file akses acak dari dan tulis (opsional) untuk itu, dengan nama yang ditentukan outfile = acak baru AccomAccessFile (dir+"/"+str, "r"); outsocket = temppsocket.getoutputStream (); } catch (FileNotFoundException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} byte bytebuffer [] = byte baru [1024]; panjang int; coba {while ((length = outfile.read (byteBuffer))! = -1) {outsocket.write (byteBuffer, 0, length); } outsocket.close (); outfile.close (); tempsocket.close (); tempsocket.close (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} // logger.info ("user"+clientip+":"+username+"Execute retr command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 226 Transfer ok"); } catch (Exception e) {pw.println ("503 urutan perintah yang buruk."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 503 urutan perintah yang buruk."); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end retr // store perintah lain jika (command.touppercase (). startswith ("store")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 sintaks kesalahan"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 501 kesalahan sintaks"); } else {coba {pw.println ("150 saluran data pembuka untuk transfer file."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 150 Membuka saluran data untuk transfer file."); RandomAccessFile Infile = NULL; InputStream Insocket = null; coba {infile = new randomAccessFile (dir+"/"+str, "rw"); insocket = temppsocket.getInputStream (); } catch (FileNotFoundException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} byte bytebuffer [] = byte baru [1024]; panjang int; coba {while ((length = insocket.read (bytebuffer))! = -1) {infile.write (byteBuffer, 0, length); } insocket.close (); infile.close (); tempsocket.close (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} // logger.info ("user"+clientip+":"+username+"Execute store command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 226 Transfer ok"); } catch (Exception e) {pw.println ("503 urutan perintah yang buruk."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 503 urutan perintah yang buruk."); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end store // perintah nlst else if (command.touppercase (). startswith ("nlst")) {logger.info ("("+username+") ("+clientip+")>"+perintah); if (loginstuts) {coba {pw.println ("150 saluran data pembuka untuk daftar direktori."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 150 membuka saluran data untuk daftar direktori."); Printwriter pwr = null; coba {pwr = printwriter baru (temppsocket.getoutputStream (), true); } catch (ioException e1) {e1.printstacktrace (); } File file = file baru (dir); String [] DISTRUKTUR = String baru [10]; distructure = file.list (); for (int i = 0; i <dirstruktur.length; i ++) {pwr.println (DirStructure [i]); } coba {temppsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} // logger.info ("user"+clientip+":"+username+"Execute nlst command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 226 Transfer ok"); } catch (Exception e) {pw.println ("503 urutan perintah yang buruk."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 503 urutan perintah yang buruk."); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // end nlst // command list lain if if (command.touppercase (). startswith ("list")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {coba {pw.println ("150 saluran data pembuka untuk daftar direktori."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 150 membuka saluran data untuk daftar direktori."); Printwriter pwr = null; coba {pwr = printwriter baru (temppsocket.getoutputStream (), true); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} Ftputil.getDetaillist (pwr, dir); coba {temppsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }} // logger.info ("user"+clientip+":"+username+"Eksekusi perintah daftar"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 226 Transfer ok"); } catch (Exception e) {pw.println ("503 urutan perintah yang buruk."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 503 urutan perintah yang buruk."); logger.error (e.getMessage ()); untuk (StackTraceElement Ste: E.GetStackTrace ()) {Logger.Error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")>"+login_warning); }} // Daftar Akhir // Masukkan perintah ilegal lain {logger.info ("("+username+") ("+clientip+")>"+perintah); pw.println ("500 kesalahan sintaks, perintah tidak dikenali."); pw.flush (); logger.info ("("+nama pengguna+") ("+clientip+")> 500 kesalahan sintaks, perintah tidak dikenali."); }} // Akhiri saat coba {logger.info ("(" ("+nama pengguna+") ("+clientip+")> terputus. "); // logger.info (" user "+clientip+": "+nama pengguna+" keluar "); bR.close (); socketclient (pw. Tempsocket.close (); java.text.SimpledateFormat; direktori./r/n ");} file [] file = dir.listFiles (); string ModifyDate; for (int i = 0; i <file.length; i ++) {ModifyDate = new SimplEdateFormat (" yyyy/mm/dd hh: mm: ss ") .Format (Tanggal baru (IFE) (IFE) (IFEDIFIFIED (IFE). (file [i] .isDirectory ()) {pw.println ("DRWXR-XR-X FTP FTP 0" + ModifyDate + "" + File [i] .getName ()); file [i] .getName ()); LOG4J.Appender.stdout.target = System.out log4j.applay.stdout.layout = org.apache.log4j.patternlayout log4j.applent.stdout.layout.conversionPattern = %d {absolute} %5p %c {1}: %l - %m %m %m %m % LOG4J.Appender.d = org.apache.log4j.dailyrollingfileAppender LOG4J.Appender.D.File = c: /logs/logs.log log4j.appender.d.append = true ## output LOG4J.Appender.d.threshold = debug.appender.appender.d.d.pattern.lay. LOG4J.Appender.D.Layout.ConversionPattern = %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %n ### Simpan informasi pengecualian ke file terpisah ### log4j.Appender.e = org #erg.apache.log4j.dailrolling ###L LOG4J.Appender.e = org #g.apache.log.dailrolling ###L LOG4J.Appender LOG4J.Appender.e.file = c: /logs/errors.log log4j.appender.e.append = true ## hanya log keluaran di atas level kesalahan !!! %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %nKonten di atas adalah pengetahuan yang relevan tentang implementasi Java dari kode FTP Server Contoh kode yang diperkenalkan kepada Anda oleh editor. Saya harap Anda menyukainya.