FTP (بروتوكول نقل ملفات نقل الملفات) هو بروتوكول يستخدم لنقل الملفات على الإنترنت. يمكن تحميل الملفات (تم تحميلها) أو تنزيلها (تنزيل) من خلال خادم FTP على الإنترنت. FTP هي خدمة عبر الإنترنت في الوقت الفعلي. قبل استخدامه ، يجب أن يكون مستخدمًا (اسم المستخدم وكلمة المرور) مع الخدمة. عند العمل ، يجب على العميل أولاً تسجيل الدخول إلى الكمبيوتر الذي هو الخادم. بعد تسجيل الدخول ، يمكن للمستخدم تنفيذ بحث الملفات ونقل الملفات والعمليات ذات الصلة الأخرى ، مثل تغيير دليل العمل الحالي ، دليل ملفات العمود ، إعداد معلمات الإرسال وملفات نقل ، وما إلى ذلك.
أوامر FTP
تستند العمليات الرئيسية لـ FTP إلى أوامر مختلفة. الأوامر الشائعة الاستخدام هي:
يعين وضع الإرسال ، والذي يتضمن ASCⅱ (النص) والوضع الثنائي الثنائي ؛
دليل الدليل أو تغيير أو عرض الدليل الحالي للكمبيوتر عن بُعد (CD ، DIR/LS الأمر) ؛
عملية الاتصال ، يتم استخدام الأمر المفتوح لإنشاء اتصال مع جهاز كمبيوتر بعيد ؛ يتم استخدام الأمر الإغلاق لإغلاق الاتصال ؛
إرسال العملية ، يتم استخدام أمر PUT لنقل الملفات إلى جهاز كمبيوتر بعيد ؛ يتم استخدام أمر PUT لنقل ملفات متعددة إلى جهاز كمبيوتر بعيد ؛
الحصول على العملية ، يتم استخدام الأمر للحصول على ملف واحد ؛ يتم استخدام أمر mgget لتلقي ملفات متعددة.
استيراد java.net.socket ؛ استيراد org.apache.log4j.logger ؛ /** * دور - الخادم A * Author Leon * */Public Class Servera {public static void main (string [] args) {Final String f_dir = "c:/test" ؛ // path port port = 22 ؛ // الاستماع إلى رقم المنفذ logger.getRootLogger () ؛ logger logger = logger.getLogger ("com") ؛ جرب {serversocket s = new servers (port) ؛ logger.info ("الاتصال بالخادم A ...") ؛ logger.info ("Connective Success! المنفذ المحلي:"+S.GetLocalPort ()+". الدليل الافتراضي:"+f_dir+"'.") ؛ بينما (صحيح) {// قبول عميل طلب العميل client = s.accept () ؛ // إنشاء مؤشر ترابط خدمة ClientThRead (Client ، f_dir) .start () ؛ }} catch (استثناء e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}}} استيراد java.io.bufferedreader ؛ استيراد java.io.file ؛ استيراد java.io.filenotfoundException ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamreader ؛ استيراد java.io.outputStream ؛ استيراد java.io.printwriter ؛ استيراد java.io.randomaccessfile ؛ استيراد java.net.connectException ؛ استيراد java.net.inetaddress ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛ استيراد java.net.unknownhostexception ؛ استيراد java.nio.charset.charset ؛ استيراد java.util.random ؛ استيراد org.apache.log4j.logger ؛ /** * فئة العميل الفرعية * @Author Leon * */ClientThread Public ClientThread يمتد Thread {Private Socketclient ؛ // مقبس العميل لوجبرز لوجبر ؛ // تسجيل الدخول إلى سلسلة private string dir ؛ عميل؛ this.dir = f_dir ؛ } Override public void run () {logger.getRootLogger () ؛ logger = logger.getLogger ("com") ؛ inputStream هو = فارغ ؛ OutputStream OS = NULL ؛ حاول {iS = socketClient.getInputStream () ؛ OS = SocketClient.getOutputStream () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} BufferedReader BR = جديد BufferedReader (New InputStreamReader (IS ، charset.forname ("UTF-8")))) ؛ printWriter PW = New PrintWriter (OS) ؛ string clientip = socketclient.getInetAddress (). toString (). substring (1) ؛ // سجل سلسلة IP للعميل username = "لم يتم تسجيل الدخول إلى" ؛ // username string password = "" ؛ String str = "" ؛ // conditer content string int port_high = 0 ؛ int port_low = 0 ؛ String Retr_ip = "" ؛ // عنوان IP الخاص بمقبس الملف المستقبلي TempSocket = null ؛ // اطبع رسالة الترحيب pw.println ("خادم 220-FTP A الإصدار 1.0 كتبه Leon Guo") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> متصل ، إرسال رسالة ترحيب ...") ؛ logger.info ("("+username+") ("+clientip+")> 220-ftp server a الإصدار 1.0 كتبه Leon Guo") ؛ منطقية ب = صواب ؛ بينما (ب) {try {// احصل على الأمر الذي تم إدخاله بواسطة أمر المستخدم = br.readline () ؛ إذا (null == command) break ؛ } catch (ioException e) {pw.println ("331 فشل في الحصول على أمر") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 331 فشل في الحصول على الأمر") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ } b = false ؛ } /** الأمر CONTROL CONRERT* / // user command if (command.toupperCase (). Startswith ("user")) {logger.info ("(لم يتم تسجيل الدخول) ("+clientip+")>"+command) ؛ اسم المستخدم = command.substring (4) .trim () ؛ if ("". يساوي (اسم المستخدم)) {pw.println ("501 Syntax Error") ؛ pw.flush () ؛ logger.info ("(لم يتم تسجيل الدخول) ("+clientip+")> 501 خطأ في بناء الجملة") ؛ اسم المستخدم = "لم يتم تسجيل الدخول" ؛ } آخر {pw.println ("331 كلمة مرور مطلوبة لـ" + اسم المستخدم) ؛ pw.flush () ؛ logger.info ("(لم يتم تسجيل الدخول) ("+clientip+")> 331 كلمة مرور مطلوبة لـ"+username) ؛ } loginStus = false ؛ } // user user // pass pass else if (command.toupperCase (). Startswith ("pass")) {logger.info ("(لم يتم تسجيل الدخول) ("+clientip+")>"+الأمر) ؛ كلمة المرور = command.substring (4) .trim () ؛ if (username.equals ("root") && password.equals ("root")) {pw.println ("230 logged On") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 230 تسجيل الدخول") ؛ // logger.info ("client"+clientip+"" تسجيل الدخول المستخدم ") ؛ loginStus = true ؛} آخر {pw.println (" 530 تسجيل الدخول أو كلمة المرور غير صحيحة! ") ؛ pw.flush () PASS // pwd أمر آخر إذا كان (+username+") (+clientip+") {logger.info ("("+username+") ( pw.println ("257 /" "+pdir+" /"الدليل الحالي") ؛ } آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end pwd // cwd command else if (command.touppercase (). startswith ("cwd")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (loginStus) {str = command.substring (3) .trim () ؛ if ("". يساوي (str)) {pw.println ("250 تم اكتشاف العميل المكسور ، المفقود إلى cwd. /" "+pdir+" /"هو الدليل الحالي.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 250 تم اكتشاف العميل المكسور 250 ، الوسيطة المفقودة إلى cwd./"+pdir+"/" هو الدليل الحالي. dir = "/" str ؛ الدليل الحالي ") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 250 cwd ناجحة./"+pdir+"/" هو الدليل الحالي ") ؛} آخر {// الدليل غير موجود pw.println (" 550 cwd فشل./ logger.info ("("+username+") ("+clientip+")> 550 cwd فشل. /"+pdir+" /": directory غير موجود. ") ؛ }} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end cwd // Quit أمر آخر إذا (command.touppercase (). startswith ("quit")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ ب = خطأ ؛ pw.println ("221 وداعا") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 221 وداعا") ؛ حاول {thread.currentThRead () ؛ thread.sleep (1000) ؛ } catch (interruptedException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} // end quit /** command command* // // port ، نقل البيانات بنشاط في وضع آخر إذا (command.touppercase (). startswith ("port")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (loginstuts) {try {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 ("،")). String str1 = str.substring (0 ، str.substring (0 ، str.lastindexof ("،")). lastIndexof ("،")) ؛ retr_ip = str1.replace ("،" ، ".") ؛ حاول {// instantiate socket tempsocket في الوضع النشط = مقبس جديد (Retr_ip ، port_high * 256 + port_low) ؛ // logger.info ("user"+clientip+":"+username+"تنفيذ أمر المنفذ") ؛ pw.println ("200 Port Command Success") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 200 Port Command Success") ؛ } catch (connectexception ce) {pw.println ("425 لا يمكن فتح اتصال البيانات.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 425 لا يمكن فتح اتصال البيانات.") ؛ logger.error (ce.getMessage ()) ؛ لـ (StackTraceElement Ste: Ce.getStackTrace ()) {logger.error (ste.toString ()) ؛ }} catch (unknownHostException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} catch (numberFormatexception e) {pw.println ("503 تسلسل سيء للأوامر.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 503 تسلسل سيء للأوامر.") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end port // pasv command ، data mode mode data else else (command.touppercase (). Startswith ("pasv")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (logInstuts) {serversocket ss = null ؛ بينما (صواب) {// احصل على الخادم المجاني port_high = 1 + generator.nextint (20) ؛ port_low = 100 + generator.nextint (1000) ؛ TREE {// Server Binding Ports SS = NEW ServersOcket (port_high * 256 + port_low) ؛ استراحة؛ } catch (ioException e) {contert ؛ }} // logger.info ("user"+clientip+":"+username+"تنفيذ أمر pasv") ؛ inetaddress i = null ؛ حاول {i = inetaddress.getlocalhost () ؛ } catch (unknownHostException e1) {e1.printStackTrace () ؛ } pw.println ("227 إدخال الوضع السلبي ("+i.gethostaddress (). استبدال ("." ، ")+" ، "+port_high+" ، "+port_low+") ") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 227 إدخال الوضع السلبي ("+i.gethostaddress (). استبدال ("." ، ")+" ، "+port_high+" ، "+port_low+") ") ؛ حاول {// socket tempsocket في الوضع السلبي = ss.accept () ؛ Ss.Close () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end pasv // retr command else (command.touppercase (). Startswith ("Retr")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (loginstuts) {str = command.substring (4) .trim () ؛ if (". pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 501 خطأ في بناء الجملة") ؛ } آخر {try {pw.println ("150 فتح قناة البيانات لنقل الملف.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 150 فتح قناة البيانات لنقل الملف.") ؛ RandomAccessFile Outfile = null ؛ OutputStream uccound = null ؛ جرب {// إنشاء دفق ملف وصول عشوائي من واكتب (اختياري) إليه ، مع الاسم المحدد Outfile = new RandomAccessFile (dir+"/"+str ، "r") ؛ توضيح = tempSocket.getOutputStream () ؛ } catch (fileNotfoundException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} byte bytebuffer [] = new byte [1024] ؛ طول int جرب {بينما ((length = outfile.read (bytebuffer))! = -1) {outCOCKET.WRITE (bytebuffer ، 0 ، length) ؛ } overcocket.close () ؛ Outfile.close () ؛ tempsocket.close () ؛ tempsocket.close () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (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 ("("+username+") ("+clientip+")> 226 Transfer OK") ؛ } catch (استثناء e) {pw.println ("503 تسلسل سيء للأوامر.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 503 تسلسل سيء للأوامر.") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end retr // stor command else (command.toupperCase (). if (loginstuts) {str = command.substring (4) .trim () ؛ if (". pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 501 خطأ في بناء الجملة") ؛ } آخر {try {pw.println ("150 فتح قناة البيانات لنقل الملف.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 150 فتح قناة البيانات لنقل الملف.") ؛ RandomAccessFile Infile = null ؛ InputStream Insocket = null ؛ حاول {infile = new RandomAccessFile (dir+"/"+str ، "rw") ؛ insocket = tempsocket.getInputStream () ؛ } catch (fileNotfoundException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} byte bytebuffer [] = new byte [1024] ؛ طول int حاول {بينما ((length = insocket.read (bytebuffer))! = -1) {infile.write (bytebuffer ، 0 ، length) ؛ } insocket.close () ؛ infile.close () ؛ tempsocket.close () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} // logger.info ("user"+clientip+":"+username+"تنفيذ أمر Stor") ؛ pw.println ("226 Transfer OK") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 226 Transfer OK") ؛ } catch (استثناء e) {pw.println ("503 تسلسل سيء للأوامر.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 503 تسلسل سيء للأوامر.") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end stor // nlst command if (command.touppercase (). Startswith ("nlst")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (loginstuts) {try {pw.println ("150 فتح قناة بيانات لقائمة الدليل.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 150 فتح قناة بيانات لقائمة الدليل.") ؛ printWriter pwr = null ؛ حاول {pwr = new printWriter (tempsocket.getOutputStream () ، true) ؛ } catch (ioException e1) {e1.printStackTrace () ؛ } ملف الملف = ملف جديد (dir) ؛ سلسلة [] تصميم = سلسلة جديدة [10] ؛ التصميم = file.list () ؛ لـ (int i = 0 ؛ i <dirstructure.length ؛ i ++) {pwr.println (dirstructure [i]) ؛ } جرب {tempsocket.close () ؛ pwr.close () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} // logger.info ("user"+clientip+":"+username+"تنفيذ أمر nlst") ؛ pw.println ("226 Transfer OK") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 226 Transfer OK") ؛ } catch (استثناء e) {pw.println ("503 تسلسل سيء للأوامر.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 503 تسلسل سيء للأوامر.") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end nlst // list command if (command.touppercase (). Startswith ("list")) {logger.info ("("+username+") ("+clientip+")>"+command) ؛ if (loginstuts) {try {pw.println ("150 فتح قناة بيانات لقائمة الدليل.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 150 فتح قناة بيانات لقائمة الدليل.") ؛ printWriter pwr = null ؛ حاول {pwr = new printWriter (tempsocket.getOutputStream () ، true) ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} ftputil.getDetaillist (pwr ، dir) ؛ حاول {tempsocket.close () ؛ pwr.close () ؛ } catch (ioException e) {logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }} // logger.info ("user"+clientip+":"+username+"تنفيذ قائمة قائمة") ؛ pw.println ("226 Transfer OK") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 226 Transfer OK") ؛ } catch (استثناء e) {pw.println ("503 تسلسل سيء للأوامر.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 503 تسلسل سيء للأوامر.") ؛ logger.error (e.getMessage ()) ؛ لـ (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.toString ()) ؛ }}} آخر {pw.println (login_warning) ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")>"+login_warning) ؛ }} // end list // أدخل الأمر غير القانوني else {logger.info ("("+username+") ("+clientip+")>"+الأمر) ؛ pw.println ("500 Syntax Error ، الأمر غير المعترف به.") ؛ pw.flush () ؛ logger.info ("("+username+") ("+clientip+")> 500 خطأ في بناء الجملة ، الأمر غير المعترف به.") ؛ }} // end بينما حاول {logger.info ("(" ("+username+") ("+cliperip+")> dissonnected. ") ؛ // logger.info (" user "+clientip+": "+username+" exit ") ؛ br.close () ؛ socketclient.close () ؛ TempSocket.Close () ؛ استيراد java.util.date ؛ dir.listfiles () ؛ pw.println ("drwxr-xr-x ftp 0" + modifyDate + "" + files [i]. pw.flush () ؛ log4j.appender.stdout.layout = org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionpattern = ٪ d {absomute} ٪ 5p ٪ c {1}: ٪ l - ٪ m ٪ n ## الإخراج log4j.appender.d = org.apache.log4j.daileAlingFiling log4j.appender.d.file = c: /logs/logs.log log4j.appender.d.append = true ## الإخراج log4j.appender.d.throshold = debug log4j.appender.d.layout = org.apache.log4j.patternlayout log4j.appender.d.layout.conversion. HH: mm: ss} [٪ t: ٪ r] - [٪ p] ٪ m ٪ n ### حفظ معلومات الاستثناء إلى ملف منفصل ### log4j.appender.e = org.apache.log4j.dailyrollingfileAppender ## اسم ملف الاستثناء log4j.appender.e.file = c: /logs/errors.log فوق مستوى الخطأ !!!المحتوى أعلاه هو المعرفة ذات الصلة بتنفيذ Java لتنفيذ رمز وظيفة خادم FTP الذي قدمه لك المحرر. أتمنى أن تعجبك.