FTP (โปรโตคอลการถ่ายโอนไฟล์โปรโตคอลการถ่ายโอนไฟล์) เป็นโปรโตคอลที่ใช้ในการถ่ายโอนไฟล์บนอินเทอร์เน็ต สามารถอัปโหลดไฟล์ (อัปโหลด) หรือดาวน์โหลด (ดาวน์โหลด) ผ่านเซิร์ฟเวอร์ FTP บนอินเทอร์เน็ต FTP เป็นบริการออนไลน์แบบเรียลไทม์ ก่อนใช้งานจะต้องเป็นผู้ใช้ (ชื่อผู้ใช้และรหัสผ่าน) พร้อมบริการ เมื่อทำงานไคลเอนต์จะต้องเข้าสู่คอมพิวเตอร์ที่เป็นเซิร์ฟเวอร์ก่อน หลังจากเข้าสู่ระบบแล้วผู้ใช้สามารถทำการค้นหาไฟล์และการถ่ายโอนไฟล์และการดำเนินการอื่น ๆ ที่เกี่ยวข้องเช่นการเปลี่ยนไดเรกทอรีการทำงานปัจจุบันไดเรกทอรีไฟล์คอลัมน์การตั้งค่าพารามิเตอร์การส่งและการถ่ายโอนไฟล์ ฯลฯ ใช้ FTP เพื่อถ่ายโอนไฟล์ทุกประเภทเช่นไฟล์ข้อความไฟล์ปฏิบัติการไบนารีไฟล์ภาพไฟล์เสียงและไฟล์การบีบอัดข้อมูล
คำสั่ง ftp
การดำเนินการหลักของ FTP ขึ้นอยู่กับคำสั่งต่าง ๆ คำสั่งที่ใช้กันทั่วไปคือ:
ตั้งค่าโหมดการส่งซึ่งรวมถึงASCⅱ (ข้อความ) และโหมดไบนารีไบนารี
การทำงานของไดเรกทอรีการเปลี่ยนแปลงหรือแสดงไดเรกทอรีปัจจุบันของคอมพิวเตอร์ระยะไกล (CD, คำสั่ง DIR/LS);
การดำเนินการเชื่อมต่อคำสั่งเปิดใช้เพื่อสร้างการเชื่อมต่อกับคอมพิวเตอร์ระยะไกล คำสั่งปิดใช้เพื่อปิดการเชื่อมต่อ
ส่งการดำเนินการคำสั่งวางจะใช้เพื่อถ่ายโอนไฟล์ไปยังคอมพิวเตอร์ระยะไกล คำสั่งวางจะใช้ในการถ่ายโอนหลายไฟล์ไปยังคอมพิวเตอร์ระยะไกล
รับการดำเนินการคำสั่งรับใช้เพื่อรับไฟล์หนึ่งไฟล์ คำสั่ง MGGET ใช้เพื่อรับหลายไฟล์
นำเข้า java.net.socket; นำเข้า org.apache.log4j.logger; /** * บทบาท - เซิร์ฟเวอร์ A * @author Leon * */เซิร์ฟเวอร์ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริงสุดท้าย f_dir = "c:/test"; // รูทพา ธ สุดท้ายพอร์ต int = 22; // ฟังหมายเลขพอร์ต logger.getRootlogger (); logger logger = logger.getLogger ("com"); ลอง {Serversocket S = ใหม่ Serversocket (พอร์ต); logger.info ("เชื่อมต่อกับเซิร์ฟเวอร์ A ... "); logger.info ("เชื่อมต่อสำเร็จพอร์ตท้องถิ่น:"+s.getLocalport ()+"ไดเรกทอรีเริ่มต้น: '"+f_dir+"'."); ในขณะที่ (จริง) {// ยอมรับไคลเอ็นต์คำขอซ็อกเก็ตลูกค้า = s.accept (); // สร้างเธรดบริการใหม่ clientThread (ไคลเอนต์ f_dir) .start (); }} catch (exception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement 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; /** * คลาส Subthread ไคลเอ็นต์ * @author Leon * */คลาสสาธารณะไคลเอนต์เธรดขยายเธรด {ซ็อกเก็ตส่วนตัวซ็อกเก็ต client; // ซ็อกเก็ตไคลเอ็นต์ logger ส่วนตัว logger; // ล็อกอินวัตถุสตริงส่วนตัว dir; // path private private pdir = "/" prient private private privent ลูกค้า; this.dir = f_dir; } @Override โมฆะสาธารณะ Run () {logger.getRootlogger (); logger = logger.getLogger ("com"); InputStream คือ = null; OutputStream OS = NULL; ลอง {is = socketClient.getInputStream (); OS = socketClient.getOutputStream (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} bufferedReader br = bufferedReader ใหม่ (ใหม่ inputStreamReader (IS, charset.forName ("UTF-8"))); PrintWriter PW = New PrintWriter (OS); String clientip = socketClient.getInetAddress (). toString (). substring (1); // บันทึกไคลเอนต์ ip string username = "ไม่เข้าสู่ระบบ"; // ชื่อผู้ใช้สตริงรหัสผ่าน = ""; // รหัสผ่านคำสั่ง = ""; // คำสั่งบูลีน string str = ""; // เนื้อหาคำสั่งสตริง int port_high = 0; int port_low = 0; string retr_ip = ""; // ที่อยู่ IP ของซ็อกเก็ตไฟล์ที่รับ tempsocket = null; // พิมพ์ข้อความต้อนรับ pw.println ("เซิร์ฟเวอร์ 220-ftp เวอร์ชัน 1.0 เขียนโดย Leon Guo"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> เชื่อมต่อส่งข้อความต้อนรับ ... "); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 220-ftp เซิร์ฟเวอร์ A เวอร์ชัน 1.0 เขียนโดย Leon Guo"); บูลีน b = true; ในขณะที่ (b) {ลอง {// รับคำสั่งที่ป้อนโดยคำสั่งผู้ใช้ = br.readline (); ถ้า (null == คำสั่ง) break; } catch (ioexception e) {pw.println ("331 ล้มเหลวในการรับคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 331 ล้มเหลวในการรับคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); } b = false; } /** คำสั่งควบคุมการเข้าถึง* // // คำสั่งผู้ใช้ถ้า (command.touppercase (). startswith ("ผู้ใช้")) {logger.info ("(ไม่เข้าสู่ระบบ) ("+clientip+")>"+คำสั่ง); ชื่อผู้ใช้ = command.substring (4) .Trim (); if ("". เท่ากับ (ชื่อผู้ใช้)) {pw.println ("501 ข้อผิดพลาดทางไวยากรณ์"); pw.flush (); logger.info ("(ไม่เข้าสู่ระบบ) ("+clientip+")> 501 ข้อผิดพลาดไวยากรณ์"); ชื่อผู้ใช้ = "ไม่เข้าสู่ระบบ"; } else {pw.println ("331 รหัสผ่านที่จำเป็นสำหรับ" + ชื่อผู้ใช้); pw.flush (); logger.info ("(ไม่เข้าสู่ระบบ) ("+clientip+")> 331 รหัสผ่านที่จำเป็นสำหรับ"+ชื่อผู้ใช้); } loginStus = false; } // end user // pass คำสั่งอื่นถ้า (command.touppercase (). startswith ("pass")) {logger.info ("(ไม่เข้าสู่ระบบ) ("+clientip+")>"+คำสั่ง); รหัสผ่าน = command.substring (4) .trim (); if (username.equals ("root") && password.equals ("root")) {pw.println ("230 เข้าสู่ระบบ"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 230 เข้าสู่ระบบ"); // logger.info ("ไคลเอ็นต์"+clientip+"" การเข้าสู่ระบบผู้ใช้ "); loginstus = true;} else {pw.println (" 530 เข้าสู่ระบบหรือรหัสผ่านไม่ถูกต้อง! "); pw.flush (); logger.info (" (ไม่เข้าสู่ระบบ) คำสั่ง pass // pwd อื่น ๆ ถ้า (command.touppercase (). startswith ("pwd")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง) pw.println ("257 /" "+pdir+" /"เป็นไดเรกทอรีปัจจุบัน"); pw.flush (); } else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // สิ้นสุด pwd // cwd คำสั่งอื่นถ้า (command.touppercase (). startswith ("cwd")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStus) {str = command.substring (3) .trim (); if ("". เท่ากับ (str)) {pw.println ("ตรวจพบไคลเอ็นต์ที่เสีย 250, อาร์กิวเมนต์ที่ขาดหายไปกับ cwd. /" "+pdir+" /"เป็นไดเรกทอรีปัจจุบัน"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 250 ไคลเอ็นต์ที่เสียตรวจพบ, อาร์กิวเมนต์ที่ขาดหายไปกับ cwd./"+pdir+"/" เป็นไดเรกทอรีปัจจุบัน ");} อื่น {// ตัดสินว่าไดเรกทอรีมีสตริง tmpdir = dir+"/"ไฟล์ = ไฟล์ใหม่ = dir+"/" str; ไดเรกทอรี "); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 250 CWD สำเร็จ/"+pdir+"/" เป็นไดเรกทอรีปัจจุบัน ");} else {// ไดเรกทอรีไม่มีอยู่ pw.println (" 550 CWD ล้มเหลว logger.info ("("+username+") ("+clientip+")> 550 CWD ล้มเหลว /"+PDIR+" /": ไม่พบไดเรกทอรี "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // สิ้นสุด cwd // ออกคำสั่งอื่นถ้า (command.touppercase (). startswith ("เลิก")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); b = เท็จ; pw.println ("221 ลาก่อน"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 221 Goodbye"); ลอง {thread.currentthread (); Thread.sleep (1,000); } catch (interruptedException e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} // end QUIT /** คำสั่งพารามิเตอร์การถ่ายโอน* /// คำสั่งพอร์ต, ส่งข้อมูลอย่างแข็งขันในโหมดอื่นถ้า (command.touppercase (). startswith ("พอร์ต")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStuts) {ลอง {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 (",")); ret_ip = str1.replace (",", "."); ลอง {// อินสแตนซ์ซ็อกเก็ต Tempsocket ในโหมดที่ใช้งานอยู่ = ซ็อกเก็ตใหม่ (retr_ip, port_high * 256 + port_low); // logger.info ("ผู้ใช้"+clientip+":"+ชื่อผู้ใช้+"เรียกใช้คำสั่งพอร์ต"); pw.println ("200 พอร์ตคำสั่งประสบความสำเร็จ"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 200 คำสั่งพอร์ตสำเร็จ"); } catch (ConnectException ce) {pw.println ("425 ไม่สามารถเปิดการเชื่อมต่อข้อมูล"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 425 ไม่สามารถเปิดการเชื่อมต่อข้อมูลได้"); logger.error (ce.getMessage ()); สำหรับ (stacktracelement ste: ce.getstacktrace ()) {logger.error (ste.toString ()); }} catch (unknownhostexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} catch (numberFormatexception e) {pw.println ("503 ลำดับที่ไม่ดีของคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 503 ลำดับที่ไม่ดีของคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // คำสั่ง end port // pasv, การถ่ายโอนโหมดพาสซีฟข้อมูลอื่นถ้า (command.touppercase (). startswith ("pasv")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStuts) {Serversocket ss = null; ในขณะที่ (จริง) {// รับพอร์ตฟรีเซิร์ฟเวอร์ port_high = 1 + generator.nextint (20); port_low = 100 + generator.nextint (1,000); ลอง {// พอร์ตที่มีผลผูกพันเซิร์ฟเวอร์ SS = ใหม่ Serversocket (PORT_HIGH * 256 + PORT_LOW); หยุดพัก; } catch (ioexception e) {ดำเนินการต่อ; }} // logger.info ("ผู้ใช้"+clientip+":"+ชื่อผู้ใช้+"เรียกใช้คำสั่ง 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+")"); ลอง {// ซ็อกเก็ต tempsocket ในโหมด passive = ss.accept (); ss.close (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // สิ้นสุด pasv // reld คำสั่งอื่นถ้า (command.touppercase (). startswith ("retr")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStuts) {str = command.substring (4) .trim (); if ("". เท่ากับ (str)) {pw.println ("501 ข้อผิดพลาดทางไวยากรณ์"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 501 ข้อผิดพลาดไวยากรณ์"); } else {ลอง {pw.println ("150 ช่องสัญญาณเปิดช่องสัญญาณสำหรับการถ่ายโอนไฟล์"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 150 การเปิดช่องข้อมูลสำหรับการถ่ายโอนไฟล์"); RandomaccessFile outfile = null; OutputStream Outsocket = null; ลอง {// สร้างสตรีมไฟล์การเข้าถึงแบบสุ่มจากและเขียน (เป็นทางเลือก) กับมันด้วยชื่อที่ระบุ outfile = new RandomAccessFile (dir+"/"+str, "r"); Outsocket = tempsocket.getOutputStream (); } catch (filenotfoundexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} byte byteBuffer [] = byte ใหม่ [1024]; ความยาว int; ลอง {ในขณะที่ ((length = outfile.read (bytebuffer))! = -1) {outsocket.write (bytebuffer, 0, ความยาว); } Outsocket.close (); outfile.close (); Tempsocket.close (); Tempsocket.close (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} // logger.info ("ผู้ใช้"+clientip+":"+ชื่อผู้ใช้+"เรียกใช้คำสั่ง REL"); pw.println ("226 transfer ok"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 226 โอนโอเค"); } catch (Exception e) {pw.println ("503 ลำดับที่ไม่ดีของคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 503 ลำดับที่ไม่ดีของคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // end retr // stor คำสั่งอื่นถ้า (command.touppercase (). startswith ("stor")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStuts) {str = command.substring (4) .trim (); if ("". เท่ากับ (str)) {pw.println ("501 ข้อผิดพลาดทางไวยากรณ์"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 501 ข้อผิดพลาดไวยากรณ์"); } else {ลอง {pw.println ("150 ช่องสัญญาณเปิดช่องสัญญาณสำหรับการถ่ายโอนไฟล์"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 150 การเปิดช่องข้อมูลสำหรับการถ่ายโอนไฟล์"); InteraccessFile Infile = null; InputStream assocket = null; ลอง {infile = new randomaccessFile (dir+"/"+str, "rw"); assocket = tempsocket.getInputStream (); } catch (filenotfoundexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} byte byteBuffer [] = byte ใหม่ [1024]; ความยาว int; ลอง {ในขณะที่ ((length = assocket.read (bytebuffer))! = -1) {infile.write (bytebuffer, 0, ความยาว); } assocket.close (); infile.close (); Tempsocket.close (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} // logger.info ("ผู้ใช้"+clientip+":"+ชื่อผู้ใช้+"เรียกใช้คำสั่ง Stor"); pw.println ("226 transfer ok"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 226 โอนโอเค"); } catch (Exception e) {pw.println ("503 ลำดับที่ไม่ดีของคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 503 ลำดับที่ไม่ดีของคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // end stor // nlst คำสั่งอื่นถ้า (command.touppercase (). startswith ("nlst")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>" คำสั่ง); if (loginStuts) {ลอง {pw.println ("150 ช่องสัญญาณเปิดช่องสำหรับรายการไดเรกทอรี"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 150 การเปิดช่องข้อมูลสำหรับรายการไดเรกทอรี"); PrintWriter PWR = NULL; ลอง {pwr = ใหม่ printwriter (tempsocket.getOutputStream (), true); } catch (ioexception e1) {e1.printstacktrace (); } ไฟล์ไฟล์ = ไฟล์ใหม่ (dir); สตริง [] distructure = สตริงใหม่ [10]; distructure = file.list (); สำหรับ (int i = 0; i <dirstructure.length; i ++) {pwr.println (dirstructure [i]); } ลอง {tempsocket.close (); pwr.close (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} // logger.info ("ผู้ใช้"+clientip+":"+ชื่อผู้ใช้+"เรียกใช้คำสั่ง NLST"); pw.println ("226 transfer ok"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 226 โอนโอเค"); } catch (Exception e) {pw.println ("503 ลำดับที่ไม่ดีของคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 503 ลำดับที่ไม่ดีของคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // end nlst // คำสั่งอื่น ๆ ถ้า (command.touppercase (). startswith ("list")) {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); if (loginStuts) {ลอง {pw.println ("150 ช่องสัญญาณเปิดช่องสำหรับรายการไดเรกทอรี"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 150 การเปิดช่องข้อมูลสำหรับรายการไดเรกทอรี"); PrintWriter PWR = NULL; ลอง {pwr = ใหม่ printwriter (tempsocket.getOutputStream (), true); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} ftputil.getDetaillist (pwr, dir); ลอง {tempsocket.close (); pwr.close (); } catch (ioexception e) {logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }} // logger.info ("ผู้ใช้"+clientip+":"+username+"execute list command"); pw.println ("226 transfer ok"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 226 โอนโอเค"); } catch (Exception e) {pw.println ("503 ลำดับที่ไม่ดีของคำสั่ง"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 503 ลำดับที่ไม่ดีของคำสั่ง"); logger.error (e.getMessage ()); สำหรับ (stacktracelement ste: e.getstacktrace ()) {logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+login_warning); }} // รายการสิ้นสุด // ป้อนคำสั่งที่ผิดกฎหมายอื่น {logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")>"+คำสั่ง); pw.println ("500 ข้อผิดพลาดไวยากรณ์, คำสั่งที่ไม่รู้จัก"); pw.flush (); logger.info ("("+ชื่อผู้ใช้+") ("+clientip+")> 500 ข้อผิดพลาดไวยากรณ์, คำสั่งที่ไม่รู้จัก"); }} // สิ้นสุดในขณะที่ลอง {logger.info ("(" ("+ชื่อผู้ใช้+") ("+clientip+")> ตัดการเชื่อมต่อ "); // logger.info (" ผู้ใช้ "+clientip+": "+ชื่อผู้ใช้" ออก "); br.close (); tempsocket.close (); นำเข้า Java.util.date; dir.listfiles (); pw.println ("drwxr-xr-x ftp ftp 0" + modifydate + "" ไฟล์ [i] .getName ()); pw.flush ();} pw.println ("ทั้งหมด:" + files.length); log4j.appender.stdout.layout = org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionPattern = %d {Absolute} %5p %c {1}: %l - %m %n ## log4j.appender log4j.appender.d.file = c: /logs/logs.log log4j.appender.d.append = true ## output log4j.appender.d.threshold = debug log4j.appender.d.layout = org.apache.log4j.patternlayout %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %n ### บันทึกข้อมูลยกเว้นไปยังไฟล์แยกต่างหาก ### log4j.appender.e = org.apache.log4j.dailylolling log4j.appender.e.append = true ## เฉพาะบันทึกเอาต์พุตเหนือระดับข้อผิดพลาด !!! ] - [ %p] %m %nเนื้อหาข้างต้นเป็นความรู้ที่เกี่ยวข้องเกี่ยวกับการใช้งาน Java ของ FTP Server Function Code ตัวอย่างรหัสที่แนะนำโดยตัวแก้ไข ฉันหวังว่าคุณจะชอบมัน