Недавно я столкнулся с необходимостью загрузки файлов на серверы Linux во время перепланировки, и теперь я разобрался с кодовыми заметками.
Этот метод соединения учитывает проблему параллелизма, и при создании FTP -соединения каждый объект соединения сохраняется в
Threadlocal <ftp>, чтобы убедиться, что каждый поток не влияет на открытие и закрытие FTP.
Package com.test.utils; импорт java.io.bufferedInputStream; Import Java.io.file; импорт java.io.filefilter; импорт java.io.fileinputstream; импорт java.io.inputstream; import java.util.arraylist; import.util.date; import.ut.list.list.lile.raylist; импорт java.ut.date; импорт. org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;public class Ftp { //Print log log private static final Log logger = LogFactory.getLog(Ftp.class); Частная статическая дата последняя_Пуш_дейт = null; частная сессия SSHSESSION; Частный канал каналов; Частный статический нитолокал <ftp> sftplocal = new Threadlocal <ftp> (); Private FTP (String Host, int port, String username, String Password) Throws Exception {jsch jsch = new jsch (); jsch.getsession (имя пользователя, хост, порт); // получить сеанс sshsession = jsch.getSession (имя пользователя, хост, порт); sshsession.setpassword (пароль); // Измените значение GSSapiaThentication в сервере/etc/ssh/sshd_config на да, чтобы нет, что решает неспособность пользователя войти в систему с дистанционным sshsession.setconfig («userauth.gssapi-with-mic», «no»); // Установить свойства для объекта сеанса. При первом доступе к серверу вам не нужно вводить yes sshsession.setConfig («StricthostKeyChecking», «Нет»); sshsession.connect (); // Получить канал SFTP = (Canelelsftp) sshsession.openchannel ("sftp"); channel.connect (); logger.info ("Подключенный FTP успешно!" + sshsession); } / ** * Это подключено * * @return * / private boolean isconnected () {return null! = Канал && cannel.isconnected (); } /** * Получить клиент SFTP, хранящийся в локальном потоке * * @return * @Throws Exception * /public static ftp getStputil (string host, int port, string username, string password), бросает исключение {// Получить локальный поток ftp sftputil = sftplocal.get (); if (null == sftputil ||! sftputil.isconnected ()) {// Предотвратить новое соединение, чтобы предотвратить локальный поток и реализовать одновременную обработку sftplocal.set (new ftp (хост, порт, имя пользователя, пароль)); } return sftplocal.get (); } / *** Отпустите клиент SFTP, который хранит локальный поток* / public static void release () {if (null! = Sftplocal.get ()) {sftplocal.get (). Roleechannel (); logger.info ("Close Connection" + sftplocal.get (). sshsession); sftplocal.set (null); }} / ** * Закрыть канал * * @Throws Exception * / public void roudeChannel () {if (null! = Channel) {try {channel.disconnect (); } catch (Exception e) {logger.error ("Исключение произошло при закрытии канала SFTP:", e); }} if (null! = sshsession) {try {sshsession.disconnect (); } catch (Exception e) {logger.error ("SFTP Close Session Exception:", e); }}} /*** @param Directory Каталог для загрузки FTP* @param uploadfile локальный каталог файлов** /public void upload (string directory, string uploadfile) throws exection {try {<br> // execute list list lsemancer.ls (каталог); <br> // execute the Drive letment switch Command.cdan.cd (heartory); <br> // executuute Команда CD -коммутации Drive Cdting CD. List <File> files = getFiles (uploadFile, новый ArrayList <File> ()); for (int i = 0; i <files.size (); i ++) {file file = files.get (i); InputStream input = new BufferedInputStream (new FileInputStream (File)); channel.put (input, file.getName ()); попробуйте {if (input! = null) input.close (); } catch (Exception e) {e.printstackTrace (); logger.error (file.getName () + "Исключение при закрытии файла ... Exception!" + e.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); logger.info (file.getName () + "Загружена файл! Удалить идентификатор:" + b); }}}} catch (Exception e) {logger.error ("[sub -sub -sub -sub -sub -sub -sub -sub -sub -subercoreTory]:", e); // Создать подкаталовый канал.mkdir (каталог); }} // Получить общедоступный список файла <File> getFiles (string realPath, list <File> files) {file realFile = new File (realPath); if (realfile.isdirectory ()) {file [] subfiles = realfile.listfiles (new filefilter () {@override public booleancece (файл файла) {if (null == last_push_date) {return true;} else {long modifydate = file.lastmodified (); return modifydate> lost_push }); for (файл файла: subfiles) {if (file.isdirectory ()) {getFiles (file.getabSolutePath (), files); } else {files.add (file); } if (null == last_push_date) {last_push_date = новая дата (file.lastmodified ()); } else {long modifydate = file.lastmodified (); if (modifydate> last_push_date.gettime ()) {last_push_date = новая дата (modifydate); }}}} return files; }}Суммировать
Выше приведено подключение Java удаленное соединение с сервером Linux, выполнение команд и файлов загрузки, введенные редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение. Редактор ответит всем вовремя!