SFTP學習

SFTP學習禮記

1.概述

SFTP與FTP差不多,幾乎一樣的語法.SFTP本身沒有單獨的守護程序,必須使用SSHD守護進程(端口號默認是22)來完成相應的連接操作.SFTP不像一個服務器程序,更像是一個客戶端程序.而且SFTP同樣是使用加密傳輸認證信息和傳輸的數據.所以,使用SFTP是安全的.但是,由於使用了加解密技術,所以效率會比普通的FTP要低很多,但是如果對安全要求較高的話,可以使用SFTP代替FTP.

SSH協議:傳輸層協議,用戶認證協議,連接協議

2.client端開發

建議使用Tamir.sharp.jsch.jce.Random第三方類庫,開源成熟.可以down "SharpSSH-1.1.1.13.src",有源碼,有demo,很好很強大.
至於平常用到的連接,取消連接,傳輸文件這些在網上一找都有對應的helper,都是使用這個Tamir.sharp.jsch.jce.Random第三方類庫

斷網重連:需要新建一條線程,然後監聽session的connectstatus,如果false則重新連接,這個不難,就是有可能會對性能造成浪費,需要開一條線程不斷監控,可以採用c#中的waitone來暫停,使它或者沒有連接的時候不監聽

斷點傳輸:首先判斷是否在目標path中是否存在那個目標file,之後讀取文件大小(因爲現在項目中的文件不存在內容會更新,故不需要驗證是否文件之前的內容有無更改,如果需要,則可以使用md5對已存在的文件file的大小進行比對)。讀取目標path中的目標file的文件大小可以使用:
string fileLongName = sh.ls(remotePath);
string[] sl = fileLongName.Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
//sl[4] is file size

之後調用
       public bool DPut(string remotePath, string localPath,int offset)//斷點續傳
        {
            try
            {
                
                Tamir.SharpSsh.java.io.InputStream src = new FileInputStream(localPath);                
                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
                src.Seek(offset, SeekOrigin.Begin);
               // src.Seek(-15, SeekOrigin.End);
                m_sftp.put(src, dst, ChannelSftp.APPEND);
                src.close();
                return true;
            }
            catch 
            {
            return false;
            }
        }
多線程傳輸:
方法一:首先將文件分割成N個文件,之後起m個線程,每個線程對那些文件進行傳輸,然後每個線程都使用斷點傳輸,那樣就比較快了.當所有傳好之後就起一個socket,告訴對方已經傳完,之後就按照每個文件的文件名來重組成一個文件.
方法二:首先在目標path中新建一個等大的文件,之後起m條線程,之後記錄下其實位置,然後就可以使用那個斷點傳輸,使用一個臨時文件來記錄下當前線程傳輸進度就可以了.那樣就不怕斷網了.斷網後依然可以繼續續傳


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章