Android Http Server
1
引言
Android如何構建Http服務器呢?本文的小例子,約莫着,還是能做個參考的^^。恩,例子實現的是PC瀏覽手機文件,支持了下載和刪除。
2
准備
Http協議現今還是RFC2616吧,其基礎的知識還是有必要了解的。弄份協議規范書參考,是個不錯的選擇。之后呢,就可以開始了^^。
起初,想自己寫個Http服務器學習來着,后來懶了==。有興趣的,推薦NanoHTTPD,很小型的僅一個類的http服務器,不過,只部分支持Http/1.1。當然還有更簡單的實現例子,不過,支持的就更少更單一了。
繼而,還是用了SDK內的HttpService實現的。該部分api源自apache httpcomponents項目中的http core。由於SDK的不同版本,在使用細節上與最新的http core還是有很多小差異的。至於本文例子,是api-8上的實現。
3
創建
Server
創建WebServer,以HttpService實現服務器。其注冊了3個請求處理,HttpFileHandler、HttpZipHandler、HttpDelHandler。當WebServer每接收一個連接,派發至WorkerThread,新線程處理每個請求。
WebServer部分代碼:
// 創建HTTP請求執行器注冊表 HttpRequestHandlerRegistry reqistry = new HttpRequestHandlerRegistry(); // 增加HTTP請求執行器 reqistry.register("*" + SUFFIX_ZIP, new HttpZipHandler(webRoot)); reqistry.register("*" + SUFFIX_DEL, new HttpDelHandler(webRoot)); reqistry.register("*", new HttpFileHandler(webRoot)); // 設置HTTP請求執行器 httpService.setHandlerResolver(reqistry); /* 循環接收各客戶端 */ isLoop = true; while (isLoop && !Thread.interrupted()) { // 接收客戶端套接字 Socket socket = serverSocket.accept(); // 綁定至服務器端HTTP連接 DefaultHttpServerConnection conn = new DefaultHttpServerConnection(); conn.bind(socket, params); // 派送至WorkerThread處理請求 Thread t = new WorkerThread(httpService, conn); t.setDaemon(true); // 設為守護線程 t.start(); }
4
啟動
Server
創建了個WebService,將WebServer套進去,實現Service方式。界面很簡單,就一個按鈕,啟動如下:

5
訪問
Server
筆記本訪問上述網址唄。


當目錄存在且可讀時才有上述畫面,不然會簡單報個404、403什么的頁面。當可寫時,增加刪除選項。返回響應頁面,在HttpFileHandler內處理的。
1)下載
文件夾:會自動打包成zip下載。其在HttpZipHandler內處理的。
文件:自動判斷類型,或顯示或下載。沒多做處理,仍就是HttpFileHandler處理的。
2)刪除
會提示是否刪除。確定刪除的話,會等處理結束提示完成,繼而確認自動刷新。

用的jquery impromptu插件,相關css、js在assets/wfs目錄內。CopyUtil提供了復制assets目錄至系統目錄的方法。
6
后記
前段時間開始看其他‘亂糟糟’的東西了。Android的小例子可能不太會再寫了==。
本文源碼:http://pan.baidu.com/s/1rIYz6