Baru -baru ini, saya menemukan kebutuhan untuk mengunggah file ke server Linux selama pembangunan kembali, dan sekarang saya telah memilah catatan kode.
Metode koneksi ini mempertimbangkan masalah konkurensi, dan saat membuat koneksi FTP, setiap objek koneksi disimpan di
Threadlocal <ftp> untuk memastikan bahwa setiap utas tidak berpengaruh pada pembukaan dan penutupan FTP.
Paket com.test.utils; impor java.io.bufferedInputStream; import java.io.file; impor java.io.filefilter; org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; priver log priven.jsch.essic; Tanggal statis privat last_push_date = null; Sshsession sesi pribadi; Saluran Saluran Pribadi; Threadlocal statis pribadi <ftp> sftplocal = threadlocal baru <ftp> (); private ftp (host string, port int, nama pengguna string, kata sandi string) melempar pengecualian {jsch jsch = jsch baru (); jsch.getSession (nama pengguna, host, port); // Dapatkan sesi sshsession = jsch.getSession (nama pengguna, host, port); sshsession.setPassword (kata sandi); // Ubah nilai gssapiauthentication di server/etc/ssh/sshd_config menjadi ya untuk tidak, yang memecahkan ketidakmampuan pengguna untuk masuk dari jarak jauh sshsession.setConfig ("userauth.gssapi-with-mic", "no"); // Atur properti untuk objek sesi. Saat mengakses server untuk pertama kalinya, Anda tidak perlu memasukkan ya sshsession.setConfig ("stricthostKeyChecking", "no"); sshsession.connect (); // Dapatkan saluran SFTP Channel = (channelsftp) sshsession.openchannel ("sftp"); channel.connect (); Logger.info ("Hubungkan FTP berhasil!" + SshSession); } / ** * Apakah itu terhubung * * @return * / private boolean isConnected () {return null! = Channel && channel.isconnected (); } /** * Dapatkan klien sftp disimpan di utas lokal * * @return * @throws Exception * /public static ftp getSftputil (host string, port int, nama pengguna string, kata sandi string) melempar pengecualian {// dapatkan utas lokal ftp sftputil = sftplocal.get (); if (null == sftputil ||! sftputil.isconnected ()) {// mencegah koneksi baru untuk mencegah utas lokal dan mengimplementasikan pemrosesan bersamaan sftplocal.set (ftp baru (host, port, nama pengguna, kata sandi)); } return sftplocal.get (); } / *** Lepaskan klien sftp yang menyimpan utas lokal* / rilis public static void () {if (null! = Sftplocal.get ()) {sftplocal.get (). CloseChannel (); logger.info ("Tutup koneksi" + sftplocal.get (). sshsession); sftplocal.set (null); }} / ** * Tutup saluran * * @throws Exception * / public void closeChanNel () {if (null! = Channel) {coba {channel.disconnect (); } catch (Exception e) {Logger.Error ("Pengecualian terjadi saat menutup saluran SFTP:", e); }} if (null! = sshsession) {coba {sshsession.disconnect (); } catch (Exception e) {logger.error ("SFTP tutup sesi pengecualian:", e); }}} /*** @param Direktori Direktori untuk mengunggah ftp* @param unggah Direktori file lokal** /public void unggahan (string direktori, string unggah) melempar pengecualian {coba {<br> // eksekutasi daftar command command channel. Daftar <FILE> file = getFiles (unggahfile, new ArrayList <FILE> ()); untuk (int i = 0; i <file.size (); i ++) {file file = file.get (i); InputStream input = new bufferedInputStream (FileInputStream baru (file)); channel.put (input, file.getName ()); coba {if (input! = null) input.close (); } catch (Exception e) {E.PrintStackTrace (); Logger.Error (file.getName () + "Pengecualian saat menutup file ... Exception!" + e.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); logger.info (file.getName () + "File Diunggah! Hapus ID:" + b); }}}} catch (pengecualian e) {logger.error ("[Subdirektori sedang dibuat]:", e); // Buat Subdirectory Channel.MKDIR (Direktori); }} // Dapatkan File Daftar Publik <FILE> GetFiles (String RealPath, Daftar <FILE> File) {File RealFile = File Baru (RealPath); if (realfile.isDirectory ()) {file [] subfiles = realfile.listFiles (filefilter baru () {@Override public boolean accept (file file) {if (null == last_push_date) {return true;} else {long modifydate = file.lastmeodified (); }}); untuk (file file: subfiles) {if (file.isDirectory ()) {getFiles (file.getAbsolutePath (), file); } else {file.add (file); } if (null == last_push_date) {last_push_date = tanggal baru (file.lastModified ()); } else {long modifyDate = file.lastModified (); if (ModifyDate> last_push_date.getTime ()) {last_push_date = tanggal baru (modifyDate); }}}} mengembalikan file; }}Meringkaskan
Di atas adalah koneksi jarak jauh Java ke Linux Server, menjalankan perintah dan mengunggah file yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas semua orang tepat waktu!