FTP (протокол протокола протокола передачи файла) - это протокол, используемый для передачи файлов в Интернете. Файлы могут быть загружены (загружены) или загружены (скачать) через FTP -сервер в Интернете. FTP-это онлайн-сервис в реальном времени. Перед его использованием он должен быть пользователем (имя пользователя и пароль) с службой. При работе клиент должен сначала войти на компьютер, который является сервером. После входа в систему пользователь может выполнять поиск файлов и передачу файлов и другие связанные операции, такие как изменение текущего рабочего каталога, каталог файлов столбцов, настройка параметров передачи и передачи файлов и т. Д. Используйте FTP для передачи всех типов файлов, таких как текстовые файлы, файлы исполняемых двоичных, файлы изображений, звуковые файлы и файлы сжатия данных.
Команды FTP
Основные операции FTP основаны на различных командах. Обычно используются команды:
Устанавливает режим передачи, который включает в себя ASCⅱ (текст) и двоичный двоичный режим;
Работа каталога, изменение или отображение текущего каталога удаленного компьютера (CD, команда DIR/LS);
Операция подключения, команда Open используется для установления соединения с удаленным компьютером; Команда Close используется для закрытия соединения;
Отправить операцию, команда PUT используется для передачи файлов на удаленный компьютер; Команда PUT используется для передачи нескольких файлов на удаленный компьютер;
Получить работу, команда GET используется для получения одного файла; Команда 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"; // root path Final int port = 22; // Прослушивание номера порта logger.getRotlogger (); Logger logger = logger.getLogger ("com"); try {serversocket s = new Serversocket (port); logger.info («подключение к серверу A ...»); logger.info ("Подключен успешно! локальный порт:"+s.getlocalport ()+". Каталог по умолчанию: '"+f_dir+"'."); while (true) {// Принять клиентский запрос на сокет client = s.accept (); // Создать службу New ClientThread (Client, F_DIR) .Start (); }} catch (Exception 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; /** * 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 = Клиент; this.dir = f_dir; } @Override public void run () {logger.getRootlogger (); logger = logger.getLogger ("com"); InputStream IS = null; OutputStream OS = null; try {is = socketClient.getInputStream (); OS = socketClient.getOutputStream (); } catch (ioException e) {logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }} BufferedReader br = new BufferedReader (new InputStreamReader (is, charset.forname ("UTF-8"))); Printwriter pw = new PrintWriter (OS); String clientip = socketClient.getInetAddress (). ToString (). Substring (1); // Запись клиента IP String username = "Не введено в систему"; // String String String = ""; // Строка пароля = ""; // Команда BOOLEAN LoginStus = FALSE; // Состояние входа в систему login_warn String str = ""; // строка содержимого команды int port_high = 0; int port_low = 0; String retr_ip = ""; // IP -адрес приема файла сокета tempsocket = null; // Распечатать приветственное сообщение PW.PRINTLN ("220-FTP-сервер версия 1.0, написанная Леоном Го"); pw.flush (); logger.info ("("+username+") ("+clientip+")> подключен, отправка приветственного сообщения ..."); logger.info ("("+username+") ("+clientip+")> 220-FTP-сервер версия 1.0, написанная Леоном Го"); логический B = true; while (b) {try {// Получить команду, введенную пользовательской командой = br.readline (); if (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; } /** Команда управления доступом* / // Пользовательская команда if (command.touppercase (). StartSwith ("user")) {logger.info ("(не вошел в систему) ("+clientip+")>"+command); username = command.substring (4) .trim (); if ("". equals (username)) {pw.println ("501 синтаксис ошибка"); pw.flush (); logger.info ("(не вошел в систему) ("+clientip+")> 501 Syntax Error"); username = "не вошел в систему"; } else {pw.println ("331 пароль, необходимый для" + username); pw.flush (); logger.info ("(не вошел в систему) ("+clientip+")> 331 пароль, необходимый для"+имени пользователя); } loginStus = false; } // end user // pass command else if (command.touppercase (). startSwith ("pass")) {logger.info ("(не введено в систему) ("+clientip+")>"+command); пароль = command.substring (4) .trim (); if (username.equals ("root") && password.equals ("root")) {pw.println ("230 зарегистрировано"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 230 зарегистрирован"); // logger.info ("client"+clientip+"" "login"); loginstus = true;} else {pw.println ("530 Login или пароль неверный!"); Pw.flush (); logger.info ("(не регистрировано) ("+clientip+")> 530 Login или пароль upcret! // end pass // pwd команда else if (command.touppercase (). startswith ("pwd")) {logger.info ("("+username+") ("+clientip+")>"+command); PW.PRINTLN ("257 /" "+PDIR+" /" - текущий каталог"); } else {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 ("". equals (str)) {pw.println ("250 Dected Client обнаружил, отсутствует аргумент в cwd. /" "+pdir+" /"" - текущий каталог. "); pw.flush (); logger.info ("("+username+") ("+clientip+")> 250 обнаружено сломанный клиент, отсутствующий аргумент в cwd./"+pdir+"/" - это текущий каталог ");} else {// Судья, есть ли в каталоге строки tmpdir = dir+"/"+str; файл file = new file (tmpdir); if (file exists) xist (tmpdir); = dir+"+str; каталог "); pw.flush (); logger.info ("("+username+") ("+clientip+")> 250 cwd успешно./"+pdir+"/" - это текущий каталог ");} else {// Каталог не существует pw.println (" 550 cwd./""+pdir+"/": не найден. logger.info ("("+username+") ("+clientip+")> 550 CWD не удастся. /"+pdir+" /": каталог не найден. "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end cwd // quit command else if (command.touppercase (). startSwith ("quit")) {logger.info ("("+username+") ("+clientip+")>"+command); b = ложь; pw.println («221 Прощай»); pw.flush (); logger.info ("("+username+") ("+clientip+")> 221 до свидания"); try {thread.currentthread (); Thread.sleep (1000); } catch (прерывание Exception e) {logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}} // end quit /** Команда параметра передачи* /// Команда порта, активно передавать данные в режиме else if (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 (",")). Lastindexof (",")+1)); String str1 = str.substring (0, str.substring (0, str.lastindexof (",")). Lastindexof (",")); retr_ip = str1.replace (",", "."); try {// intantiate stocket tempsocket в Active Mode = New Socket (retr_ip, port_high * 256 + port_low); // logger.info («пользователь»+clientip+»:"+username+"execute port command"); pw.println ("200 Port Command успешно"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 200 порта команда успешного"); } 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 ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end port // Команда PASV, данные передачи пассивного режима ense if (command.touppercase (). startSwith ("pasv")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {serversocket ss = null; while (true) {// Получить сервер бесплатный порт port_high = 1 + generator.nextint (20); port_low = 100 + Generator.nextint (1000); try {// Сервер привязывающий порты ss = new Serversocket (port_high * 256 + port_low); перерыв; } catch (ioException e) {продолжить; }} // logger.info ("user"+clientip+":"+username+"execute pasv command"); InetAddress i = null; try {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 (). reply (".", ",")+","+port_high+","+port_low+")"); try {// сокет Tempsocket в пассивном режиме = ss.accept (); ss.close (); } catch (ioException e) {logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end pasv // retr Comaning else if (command.touppercase (). startSwith ("retr")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 синтаксис ошибка"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 501 Синтаксис ошибка"); } else {try {pw.println ("150 Открытие канала данных для передачи файла."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 150 Открытие канала данных для передачи файла."); Randomaccessfile outfile = null; OutputStream outsocke = null; try {// создать поток файла случайного доступа и написать (необязательно), с указанным именем outfile = new randomaccessfile (dir+"/"+str, "r"); AUTSOCKESOCE = 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 длина; try {while ((length = outfile.read (bytebuffer))! = -1) {outsockeoske.write (bytebuffer, 0, length); } outsockeoske.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 retring command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 226 Transfer OK"); } catch (Exception e) {pw.println ("503 Плохая последовательность команд."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 Плохая последовательность команд."); logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end retr // команда Stor else if (command.touppercase (). startSwith ("stor")) {logger.info ("("+username+") ("+clientip+")>"+command); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 синтаксис ошибка"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 501 Синтаксис ошибка"); } else {try {pw.println ("150 Открытие канала данных для передачи файла."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 150 Открытие канала данных для передачи файла."); Randomaccessfile infile = null; Inputstream insocket = null; try {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 длина; try {while ((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+"execute stor command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 226 Transfer OK"); } catch (Exception e) {pw.println ("503 Плохая последовательность команд."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 Плохая последовательность команд."); logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end stor // nlst command else if (command.touppercase (). startswith ("nlst")) {logger.info ("("+usermeme+") ("+clientip+")>"+command); if (loginstuts) {try {pw.println ("150 открытие канала данных для списка каталогов."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 150 Открытие канала данных для списка каталогов."); Printwriter pwr = null; try {pwr = new PrintWriter (tempSocket.getOutputStream (), true); } catch (ioException e1) {e1.printstacktrace (); } File file = new File (dir); String [] ritucture = new String [10]; restucture = file.list (); for (int i = 0; i <dirstructure.length; i ++) {pwr.println (dirstructure [i]); } try {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); для (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 ("("+username+") ("+clientip+")> 226 Transfer OK"); } catch (Exception e) {pw.println ("503 Плохая последовательность команд."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 Плохая последовательность команд."); logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end nlst // Список команды else 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; try {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); try {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }} // logger.info ("user"+clientip+":"+username+"execute list command"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 226 Transfer OK"); } catch (Exception e) {pw.println ("503 Плохая последовательность команд."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 Плохая последовательность команд."); logger.error (e.getMessage ()); для (StackTraceElement Ste: e.getStackTrace ()) {logger.error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end list // Введите незаконную команду else {logger.info ("("+username+") ("+clientip+")>"+command); pw.println ("500 Синтаксис ошибка, команда не распознана."); pw.flush (); logger.info ("("+username+") ("+clientip+")> 500 ошибка синтаксиса, команда не распознается."); }} // end while try {logger.info ("(" ("+username+") ("+clientip+")> Densuncted. "); // logger.info (" user "+clientip+": "+username+" exit "); br.close (); socketclient.close (); pw.close (); Tempsock.close (); java.util.date; dir.listfiles (); pw.println ("drwxr-xr-x ftp ftp 0" + modifydate + "" + файлы [i] .getName ()); pw.flush (); log4j.appender.stdout.layout = org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionpattern = %d {Absolute} %5p %c {1}: %l - %m %n ## log4j.pperender.d = org.apache.log4j.dailtingfenderfender. 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 HH: MM: SS} [ %t: %r] - [ %p] %m %n ### Сохранить информацию о исключении в отдельном файле ### log4j.appender.e = org.apache.log4j.dailyrollingfileappender ## file file file file name.appender.e.file = c: /logs/errors.log. Выше уровня ошибок !!!Приведенный выше контент - это соответствующие знания о реализации Java функции FTP -сервера Пример кода, введенного вам редактором. Надеюсь, вам понравится.