В этой статье представлено, как использовать существующие доступные библиотеки в Java для написания клиентского кода FTP и разрабатывать его в элементы управления апплета для производства пакетных, больших файлов загрузки и загрузки управления на основе Интернета. Основываясь на серии библиотек клиентов FTP, статья содержит подробные объяснения и реализации кода в одной из наиболее распространенных и мощных библиотеки J-FTP, таких как бары прогресса, продолжение точки останова, отображение внутренних и внешних сетей, а также функции JavaScript в javascript в апплете. Есть надежда, что эта статья сыграет роль в привлечении нефрита.
1. Введение
Во время реализации проекта появилось требования к загрузке и загрузке файлов. Пользователям по всей провинции (или общенациональной) необходимо загрузить некоторые файлы на файловый сервер в определенном центре. Эти документы используются для некоторого крупномасштабного инженерного строительства, которое может включать строительные проекты на сумму десятков миллионов или даже сотни миллионов юаней. Файлы имеют три отдельные характеристики: одна из них является большим файлом, который может достигать 50 м; Во -вторых, количество файлов большое, что может быть около 15; Третье заключается в том, что цифровые подписи и шифрование данных требуются с точки зрения безопасности данных.
Прежде всего, рассмотрим метод передачи на основе HTTP. Однако, благодаря сравнению, я быстро обнаружил, что вышеупомянутые потребности были удовлетворены:
1: Загрузка с использованием протокола HTTP, по -видимому, более подходит для удобства веб -программирования; Загрузка файлов менее 1м немного быстрее, чем загрузка файлов с помощью протокола FTP. Но может быть нечего делать с передачей партии и больших файлов. Конечно, он также имеет свои преимущества, например, в отличие от FTP, необходимо запустить службу FTP на стороне сервера.
2: Загрузка файлов с файлами, превышающим 1 м, с использованием протокола FTP быстрее, чем HTTP. Чем больше файл, скорость загрузки будет в несколько раз быстрее, чем скорость загрузки HTTP. И написать программы на Java; FTP более удобен, чем http.
Однажды автор использовал VB и написал элементы управления ActiveX для загрузки и загрузки пакетных файлов, и его функции также очень мощные. Просто, поскольку нет особой цифровой подписи для файлов CAB или OCX, необходимо выполнить утомительные настройки для клиента, такие как настройка защищенного сайта, снижение уровня безопасности клиента и т. Д., Некоторые решения были отброшены.
В то же время, учитывая, что файлы необходимо подписаны в цифровой форме и шифрованы на клиенте, было решено использовать аппет для их реализации. Полем Перед загрузкой файла локальная информация о ключе USBKEY может быть получена от клиента, чтобы завершить обработку шифрования и подписи загруженного файла. Несмотря на то, что для использования апплета требуется установка среды выполнения JRE на клиенту, что приводит к некоторым неудобствам для управления и использования клиента, это может быть относительно небольшая цена для сравнения безопасности такого большого количества файлов и файлов.
Суммировать операционную среду:
FTP-серверная сторона: Serv-U, профессиональная программа FTP-сервера, в Интернете есть готовые загрузки программного обеспечения, конечно, читатели также могут написать программу получения FTP на стороне сервера, чтобы объяснить. Если нет особых требований или функций, Serv-U должен соответствовать нашим потребностям в общей загрузке и загрузке;
Клиент: Java Applet, технология, которая сделала Java популярной тогда, которая, как утверждается, была сопоставимой с Microsoft ActiveX. Конечно, теперь у Java есть Java FX. Это замена апплета?
Среда приложения: Интернет, конечная цель.
2. Выбор клиентской библиотеки Java FTP
Давайте представим сценарий - мы хотим написать чистое приложение Java, которое загружает и загружает файлы с FTP -сервера, работающего на удаленном компьютере; Мы также хотим получить базовую информацию файла для этих удаленных файлов для загрузки, например, имя файла, данные или размер файла.
Хотя возможно и, возможно, интересно написать обработчик протокола FTP с нуля, работа также сложна, длинная и потенциально опасная. Поскольку мы не хотим тратить время, энергию или деньги на написание такой программы обработки сами, мы обращаемся к многоразовым компонентам, которые уже существуют. И много библиотек доступны в Интернете.
Найти отличную клиентскую библиотеку Java FTP, которая соответствует нашим потребностям, не так просто, как кажется. Напротив, это очень болезненная и сложная задача. Во -первых, требуется некоторое время, чтобы найти клиентскую библиотеку FTP. Во -вторых, после того, как мы найдем все существующие библиотеки, какие из них мы должны выбрать? Каждая библиотека подходит для разных потребностей. Эти библиотеки не эквивалентны в результате производительности и имеют фундаментальные различия в их дизайне. Каждая библиотека имеет свои характеристики и использует разные термины для их описания. Следовательно, оценка и сравнение клиентских библиотек FTP является сложной задачей.
Использование многоразовых компонентов является защищенным подходом, но в этом случае он часто обескураживает в начале. Позже мне может быть немного стыдно: после выбора хорошей библиотеки FTP последующая работа очень проста, просто следуйте простым правилам. В настоящее время существует много общедоступных и бесплатных клиентских библиотек FTP, таких как SimpleFTP, J-FTP и т. Д., И многие другие FTPClients. Как показано в следующей таблице, таблица не может быть перечислена все. Если у читателей есть лучшая клиентская библиотека классов FTP, пожалуйста, сделайте дополнительные добавки.
В этой статье автор принимает J-FTP. Это открытый исходный код и очень мощная клиентская библиотека FTP. Автор очень нравится, а также рекомендует всем читателям. Забудьте об этом бесплатно и сделайте рекламу для этого.
3. Основные функции
1. Войдите в систему
FTP используется для передачи файлов, но, по сути, Java.net.socket используется для связи. Следующий код является лишь одним из методов входа в систему класса net.sf.jftp.net.ftpconnection. Конечно, чтобы сохранить макет и четко объяснить некоторые принципы в следующем коде, автор удалил некоторые ненужные коды, такие как журналы и другие коды. Для полного кода, пожалуйста, обратитесь к исходному коду J-FTP или примеру исходного кода автора. Следующие примеры кода одинаковы:
public int login (String username, String password) {this.username = username; this.password = пароль; int status = login_ok; jcon = new JConnection (хост, порт); if (jcon.ishere ()) {in = jcon.getReader (); if (getline (положительный) == null) // ftp220_service_ready) == null) {ok = false; Статус = офлайн; } if (! getLine (LogInack) .StartSwith (положительный)) // ftp230_logged_in)) {if (success (положительный)) // ftp230_logged_in)) {} else {ok = false; status = неверно_логин_дата; }}} else {if (msg) {log.debug ("ftp недоступен!"); ОК = ложь; status = generic_failed; }} if (ok) {connected = true; система(); бинарный (); String [] advsettings = new String [6]; if (getostype (). indexof ("os/2")> = 0) {list_default = "list"; } if (list.equals ("default")) {// Просто получить первый элемент (каким -то образом он знает, сначала - это команда // ftp list) advsettings = loadset.loadset (futs.adv_settings); // *** Если файл не найден, создайте его и установите в List_default if (advsettings == null) {list = list_default; Saveset s = new Saveset (sutres.adv_settings, list); } else {list = AdvSettings [0]; if (list == null) {list = list_default; }}} if (getostype (). indexof ("mvs")> = 0) {list = "list"; } // *** FireDirectoryUpdate (this); FireConnectionInitialized (это); } else {FireConnectionFailed (это, новое целое число (состояние) .toString ()); } Статус возврата; } В этом методе входа в систему есть класс JConnection, который отвечает за создание розетков. В то же время этот класс представляет собой отдельный поток. Преимущество состоит в том, что для того, чтобы сотрудничать с изменениями интерфейса, подключения к сетевым гнездам и другие задачи обрабатываются в виде отдельных потоков, что способствует дружелюбии интерфейса. Ниже приведен метод выполнения Net.sf.jftp.net.jconnection Class. Конечно, стартап этого потока запускается в конструкторе класса JConnection.
public void run () {try {s = new Socket (host, port); localport = s.getlocalport (); // if (время> 0) s.setsotimeout (time); out = new PrintStream (New BufferedOutputStream (S.GetOutputStream (), настройки.buffersize)); in = new BufferedReader (новый inputStreamReader (S.GetInputStream ()), settings.buffersize); isok = true; //}} catch (Exception ex) {ex.printStackTrace (); Log.out («Предупреждение: соединение закрыто из -за исключения (" + host + ":" + port + ")"); isok = false; попробуйте {if (s! = null) &&! s.isclosed ()) {s.close (); } if (out! = null) {out.close (); } if (in! = null) {in.close (); }} catch (Exception ex2) {ex2.printstackTrace (); Log.out («Предупреждение: получил больше ошибок, пытаясь закрыть гнездо и потоки»); }} установлено = true; }Здесь сокет в этом методе прогона объяснит, что этот тип реализации клиентских гнезлок (также называемый «сокеты»), которые представляют собой конечные точки связи между двумя машинами. Фактическая работа сокета выполняется экземпляром класса сокета. Приложение реализует фабрику сокета, которая создает гнезда, изменяя фабрику сокета, которая может настроить себя для создания сокетов, которые подходят для локального брандмауэра. Для конкретных инструкций, пожалуйста, обратитесь к инструкциям API JDK5, предпочтительно на китайском языке. хе -хе.
2 Загрузить и скачать
Загрузку файлов можно разделить на многопоточную и однопоточную, что относительно просты в однопоточных ситуациях, в то время как в многопоточных ситуациях, все больше вещей, которые нужно обрабатывать и более осторожно. Ниже приведен метод загрузки загрузки Net.sf.jftp.net.ftpconnection. Были рассмотрены два разных типа, одиночные и многопоточные.
public int handleupload (string file, string realname) {if (futures.getEnableMultIThReading () && (! sutres.getNouploadMultIThReading ())) {log.out ("Сокращение нового потока для этой загрузки."); Ftptransfer t; if (realName! = null) {t = new ftpTransfer (host, port, getLocalPath (), getCachedPwd (), файл, имя пользователя, пароль, transform.upload, gandler, слушатели, realName, crlf); } else {t = new ftpTransfer (host, port, getLocalPath (), getCachedPwd (), файл, имя пользователя, пароль, transform.upload, обработчик, слушатели, CRLF); } lastTransfer = t; вернуть new_transfer_spawnd; } else {if (stens.getNouploadThultIThReading ()) {log.out ("upload multiThreading отключен."); } else {log.out ("MultiThreading полностью отключено."); } return (realName == null)? загрузить (файл): upload (file, realName); }} В случае многопоточного, существует отдельный класс net.sf.jftp.net.ftptransfer. Конечно, в случае многопоточного, этот класс должен быть отдельным потоком. Подобно JConnection, запуск его потока также запускается в конструкторе. В своем методе запуска файл читается и передается.
public void run () {if (handler.getConnections (). get (file) == null) {handler.addconnection (файл, это); } else if (! pause) {log.debug ("Transfer уже в процессе:" + file); Работа = ложь; stat = 2; возвращаться; } boolean haspaused = false; while (pause) {try {runner.sleep (100); if (слушатели! = null) {for (int i = 0; i <slieders.size (); i ++) {((connectionListener) слушатели. Elementat (i)). }} if (! work) {if (слушатели! = null) {for (int i = 0; i <slireders.size (); i ++) {((connectionListener) слушатели. Elementat (i)). }}}} catch (Exception ex) {} haspaused = true; } while (((handler.getConnectionsize ()> = futures.getMaxConnections ()) && (handler.getConnectionsize ()> 0) && work) {try {stat = 4; Runner.sleep (400); if (! Haspaused && (слушатели! = null)) {for (int i = 0; i <slireders.size (); i ++) {(((connectionListener) слушатели. Elementat (i)). }} else {break; }} catch (Exception ex) {ex.printstackTrace (); }} if (! work) {if (слушатели! = null) {for (int i = 0; i <slireders.size (); i ++) {((connectionListener) слушатели. Elementat (i)). }} handler.removeconnection (file); stat = 3; возвращаться; } начало = true; try {runner.sleep (stens.ftptransferthreadpause); } catch (Exception ex) {} con = new ftpconnection (host, port, remotepath, crlf); con.setConnectionHandler (обработчик); con.setConnectionListeners (слушатели); int status = con.login (user, pass); if (status == ftpconnection.login_ok) {file f = new File (localPath); con.setlocalpath (f.getabsolutepath ()); if (type.equals (upload)) {if (newname! = null) {transferstatus = con.upload (file, newName); } else {transferstatus = con.upload (file); }} else {transferstatus = con.download (file, this.newname); }} if (! pause) {handler.removeconnection (file); }} Что касается процесса загрузки, поскольку это обратный процесс загрузки, он похож на метод загрузки и метод записи. По некоторым причинам код не указан, но его идеи и идеи точно такие же. Пожалуйста, обратитесь к исходному коду для читателей.
4. Прогресс
Можно предположить, что если во время загрузки или загрузки не будет подсказки, пользователь не может судить, выполнена ли задача или мертва задача, а пользователь часто вводит в заблуждение из -за времени загрузки или времени загрузки слишком длинным. Следовательно, план прогресса очень важен и практичен.
Реализация панели прогресса на самом деле очень проста. Это открыть два потока в программе. Первый поток используется для динамического изменения значения панели хода на интерфейс, в то время как второй поток образует цикл во время процесса загрузки или загрузки. В этом цикле определенное количество данных, таких как 8192 байтов, читается каждый раз. Затем после передачи этих данных вызовите метод обновления Progresspress в первом потоке, чтобы обновить значение панели выполнения интерфейса.
Во время процесса загрузки или загрузки (см. Метод запуска класса FTPTransfer в предыдущем разделе) вы можете просмотреть метод con.upload (файл, NewName), код заключается в следующем.
public int upload (строковый файл, строка realName, inputstream in) {hasuploaded = true; Log.out ("FTP загрузка началась:" + это); int stat; if ((in == null) && new File (file) .isdirectory ()) {shortprogress = true; FileCount = 0; basefile = file; datatype = dataConnection.putDir; isdirupload = true; stat = uploadDir (файл); shortProgress = false; //System.out.println(filecount + ":" + basefile); FireProgressUpdate (basefile, dataConnection.dfined + ":" + fileCount, -1); FireactionFined (это); FireDirectoryUpdate (это); } else {datatype = dataConnection.put; stat = ravupload (файл, realName, in); try {thread.sleep (100); } catch (Exception ex) {} FireactionFined (this); FireDirectoryUpdate (это); } try {thread.sleep (500); } catch (Exception ex) {} return stat; }Этот метод отвечает за загрузку определенного количества байтов. На самом деле, он называется методом Rawupload. Это не перечислено здесь. Пожалуйста, обратитесь к исходному коду. После передачи этих байтовых данных метод UpdateProgressBar () в основном потоке вызывается, вызывая метод FireactionFined (). На самом деле код заключается в следующем:
Protected void update progressbar () {int protlion = (int) (((float) lfileCopletesize / (float) lfilesize) * 10000f); pbfile.setValue (процент); // System.out.println ("============================================================ pbfile.setString (lfileCopleteSize / 1024L + " /" + lfilesize / 1024L + "KB"); процент = (int) (((float) ltotalCompletesize / (float) ltotalsize) * 10000f); pbtotal.setString (ltotalCompletesize / 1024L + " /" + ltotalSize / 1024L + "KB"); pbtotal.setValue (процент); Repaint (); } Выше используются два стержня прогресса. Первая панель прогресса представляет прогресс загрузки или загрузки текущего файла, а вторая строка прогресса представляет прогресс всех файлов загрузки или загрузки. В то же время, чтобы генерировать более очевидную прогрессию или изменение прогресса, максимальное значение проработаного плана устанавливается на 10 000 по pbfile.setmaximum (10000) и pbtotal.setmaximum (10000), а не 100, которые мы обычно устанавливаем. Автор считает, что это лучше, потому что иногда при загрузке или загрузке изменения могут быть относительно небольшими по причинам сети. Если установлено в 100, изменение не особенно очевидно.
Выше приведено основная статья для загрузки и загрузки больших партий файлов FTP. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать wulin.com больше.