大家好,今天跟大家介紹一個讓原生Android也可以做Web開發的開源項目——AndServer。
開源地址:https://github.com/yanzhenjie/AndServer
AndServer是一個Android端的Web服務器,類似Apache或者Tomcat,但又有不同,它是一個普通的Android Library,Android項目Gradle遠程依賴或者添加Jar包皆可引入該項目,然后就通過正常Android開發一樣開發App了。
AndServer是用純Android API寫一個庫,所以不用任何第三方的庫或者什么硬件編譯,打成Jar包后僅僅580kb。
很多人看到這里就有疑問了:它的使用場景是什么?按照國際慣例,我舉個栗子:
某公司公開了一款TV APP,可以安裝在電視或者盒子上,有一個功能是這樣的:
APP安裝在電視上打開后,會生成一個ID,用戶用微信掃碼通過公司提供的公眾號和該電視上的該APP綁定,用戶通過公眾號打開一個H5頁面,這個頁面可以上傳圖片或者視頻到服務器,服務器檢測到該用戶和某個屏幕的APP綁定,動態把用戶發送的圖片或者視頻發送到電視播放。
這樣一個功能是很好的體驗,但是耗費服務器資源、遠端上傳、遠端下載也都需要時間,還不如我直接用U盤拷貝到電視呢。那么如果我通過網頁在局域網直接把視頻或者圖片發送到電視上的APP播放,豈不是更加直接快捷?
當然大部分同學可能很少接觸到APP之間互相在局域網通信、局域網上傳下載、局域網登錄這樣的需求,還有很多栗子我就不舉了,下面開始正式安利。
特點
-
接受客戶端文件上傳、下載文件。
-
動態Http API,就像Java的Servlet一樣寫接口。
-
部署靜態網站,例如純Html,支持JS、CSS、Image分離。
-
部署動態網站,例如Html表單,當然可以結合上面的Android Http接口。
基本上和Java的Servlet一樣的功能,如果你做過Java開發或者其它語言的Web開發應該就很熟悉了。
依賴
compile 'com.yanzhenjie:andserver:1.0.2'
<dependency> <groupId>com.yanzhenjie</groupId> <artifactId>andserver</artifactId> <version>1.0.2</version> <type>pom</type> </dependency>
-
ADT,可以去AndServer主頁下載Jar包。
使用方法
好的教程是sample,建議到AndServer主頁下載sample運行查看效果,然后結合README就更加清晰了。
創建服務器
AndServer andServer = new AndServer.Build()
...
.build(); Server mServer = andServer.createServer();
... mServer.start();
... mServer.stop();
... boolean running = mServer.isRunning();
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
端口號和響應超時設置
AndServer andServer = new AndServer.Build()
.port(8080) .timeout(10 * 1000) ...
.build();
...
部署網站
部署網站是通過Website接口,你也可以自己實現這個接口,當然AndServer已經提供了兩個默認實現:
-
AssetsWebsite
-
StorageWebsite
如果用上面兩個實現注冊你的網站,那么你的默認首頁(index.html)是:
http://ip:port/ http://ip:port/youPath http://ip:port/youPath/index.html
注冊網站到AndServer
Wesite wesite = new AssetsWebsite(AssetManager, youPath); Wesite wesite = new StorageWebsite(youPath);
AndServer andServer = new AndServer.Build()
...
.website(wesite);
.build();
AssetsWebsite的使用
如果你的網站在assets下,那么你就用AssetsWebsite來部署你的網站。
使用方法是:
AssetManager mAssetManager = getAssets();
Wesite wesite = new AssetsWebsite(mAssetManager, youPath);
上面我們看到new AssetsWebsite時需要傳一個AssetManager和一個path,path支持assets根目錄和子目錄,下面是這兩種情況的舉例。
-
如果你的網站在
assets根目錄下, 你的path就填"",比如:
Wesite wesite = new AssetsWebsite(mAssetManager, "");
那么你的默認首頁訪問地址就是:
http://ip:port http://ip:port/index.html
那么你的其它頁面訪問地址是:
http://ip:port/login.html http://ip:port/error.html
比如:
http://192.168.1.12:8080/index.html http://192.168.1.12:8080/login.html
-
如果你的網站根目錄在
assets的子目錄下,那么你傳入assets的相對目錄地址就好了比如你的網站在assets下web目錄,例如:
Wesite wesite = new AssetsWebsite(mAssetManager, "web");
那么你的默認首頁訪問地址就是:
http://ip:port http://ip:port/web http://ip:port/web/index.html
那么你的其它頁面訪問地址是:
http://ip:port/web/login.html http://ip:port/web/error.html
例如:
http://192.168.1.12:8080/ http://192.168.1.12:8080/index.html http://192.168.1.12:8080/web/index.html http://192.168.1.12:8080/web/index.html http://192.168.1.12:8080/web/login.html
StorageWebsite的使用
如果你的網站在內存設備下,只要以文件的形式可以讀取到,那么你就用StorageWebsite來部署你的網站,比如你的網站在SD卡下時。
使用方法是:
Wesite wesite = new StorageWebsite(youPath);
它很簡單,只要傳入你的網站的存儲目錄地址即可,例如你的網站在SD卡下的www目錄:
File file = new File(Environment.getExternalStorageDirectory(), "www");
String websiteDirectory = file.getAbsolutePath();
Wesite wesite = new StorageWebsite(websiteDirectory);
訪問地址和AssetsWebsite的道理相同。
像Servlet一樣寫Http接口
Http API是通過RequestHandler接口來注冊的,它是一個Java interface,它和Java的Servlet一樣。
你需要實現這個接口,然后在AndServer注冊即可,例如:
public class RequestLoginHandler implements RequestHandler { @Override public void handle(HttpRequest req, HttpResponse res, HttpContext con) {
Map<String, String> params = HttpRequestParser.parse(request); String userName = params.get("username");
String password = params.get("password"); if ("123".equals(userName) && "123".equals(password)) {
StringEntity stringEntity = new StringEntity("Login Succeed", "utf-8");
response.setEntity(stringEntity);
} else {
StringEntity stringEntity = new StringEntity("Login Failed", "utf-8");
response.setEntity(stringEntity);
}
}
}
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
然后在AndServer中注冊:
AndServer andServer = new AndServer.Build()
...
.registerHandler("login", new RequestLoginHandler())
.build();
現在你就得到了一個的訪問地址:http://ip:port/login, 例如:
http://192.168.1.12:8080/login?username=123&password=123
文件下載和文件上傳的例子請下載sample查看。
提交Html表單到Android端
在Html的form的action中填入你注冊RequestHandler時的key就可以了,然后在RequestHandler的
handle(HttpRequest, HttpResponse, HttpContext)
方法就可以獲取form提交的參數了。
比如我們上面注冊Login RequestHandler在form中這樣使用:
<form id="form1" method="post" action="login"> ... </form>
監聽服務器的狀態
服務器一般情況下有三種狀態:成功啟動、啟動時失敗、成功停止服務器,失敗時會返回一個異常,一般情況下是網絡問題或者端口被占用。
private Server.Listener mListener = new Server.Listener() { @Override public void onStarted() { } @Override public void onStopped() { } @Override public void onError(Exception e) { }
};
AndServer andServer = new AndServer.Build()
...
.listener(mListener)
.build();
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。