Android開發_swiftp開源ftp服務端移植

swiftp是一個開源的ftp server,源碼能夠從下面地址拉。java

Google code : http://code.google.com/p/swiftp/downloads/list
GitHub :          https://github.com/ppareit/swiftp
android

本身的需求是將ftp server移植到本身的app中,使用USB數據線管理手機上的文件。其實google code連接源碼中已經包含了一個完整的android app(github連接的源碼貌似有點不一樣)。git

這裏只是記錄一下調試的過程,將源碼import成android project以後運行,有如下幾個注意的地方:github

1. 源碼default.java中swift

public static final boolean release = true;//能夠改爲false打開log的開關,方便調試。服務器

2. 遇到「550 Invalid name or chroot violation」(能夠從源碼中找到打這個log的代碼行)的錯誤,那必定是配置頁面中sd卡的路徑不正確。網絡

對應的代碼是在CmdCWD.java文件中,再去分析爲何不對。提醒一點sd卡的根路徑有/mnt/sdcard和/storage/sdcard0,跟android版本有關係。session

  
1 // Ensure the new path does not violate the chroot restriction 2 if (violatesChroot(newDir)) { 3 errString = " 550 Invalid name or chroot violation\r\n " ; 4 sessionThread.writeString(errString); 5 myLog.l(Log.INFO, errString); 6 break mainblock; 7 }

3. 在PC上使用的FileZilla這個ftp client測試的,測試鏈接成功可是沒法進行上傳刪除等操做(提示相似STOR error: 451 Couldn't open file "test.txt" aka  錯誤log)。app

緣由是源碼manifest.xml中沒有設sd卡的讀寫權限。socket

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4. 上面是測試在同一個wifi網絡下,無線ftp能夠鏈接成功。那經過USB的ftp能成功麼?

本身調試了一下,也是能夠的,不過有如下地方要注意或者要修改的:

4.1 USB進行ftp鏈接,那在client填寫的地址是迴環地址(就像pc和android用socket鏈接那樣,用127.0.0.1)

4.2 ftp無非也是基於HTTP,底層socket鏈接的,那pc端必需要執行adb forward tcp:*** tcp:*** 來進行端口轉換,由於ftp協議有兩個端口,上圖中的2121是控制端口,那還有數據傳輸端口?這個是在源碼中動態獲取的,在NormalDataSocketFactory.java中的server = new ServerSocket(0, Defaults.tcpConnectionBacklog);這句話。

  
1 public int onPasv() { 2 clearState(); 3 try { 4 // Listen on any port (port parameter 0) 5 server = new ServerSocket( 0 , Defaults.tcpConnectionBacklog); 6 myLog.l(Log.DEBUG, " Data socket pasv() listen successful " ); 7 return server.getLocalPort(); 8 } catch (IOException e) { 9 myLog.l(Log.ERROR, " Data socket creation error " ); 10 clearState(); 11 return 0 ; 12 } 13 }

本身是暫時改爲了server = new ServerSocket(2221, Defaults.tcpConnectionBacklog);也就是2221這個固定端口。在ftp client鏈接以前,執行adb forward tcp:2121 tcp:2121和

adb forward tcp:2221 tcp:2221這兩條命令。而後再鏈接(無線ftp和USB均可以)都是OK的了。

 

 

上面只是我的的一個記錄,可能還會有一些問題,先記錄一下。

參考資料

Android中FTP服務器、客戶端搭建以及SwiFTP、ftp4j介紹

相關文章
相關標籤/搜索