你們好,今天跟你們介紹一個讓原生Android也能夠作Web開發的開源項目——AndServer。javascript
開源地址:github.com/yanzhenjie/…html
AndServer
是一個Android端的Web服務器,相似Apache或者Tomcat,但又有不一樣,它是一個普通的Android Library,Android項目Gradle遠程依賴或者添加Jar包皆可引入該項目,而後就經過正常Android開發同樣開發App了。java
AndServer
是用純Android API寫一個庫,因此不用任何第三方的庫或者什麼硬件編譯,打成Jar包後僅僅580kb。android
不少人看到這裏就有疑問了:它的使用場景是什麼?按照國際慣例,我舉個栗子:git
某公司公開了一款TV APP,能夠安裝在電視或者盒子上,有一個功能是這樣的:
APP安裝在電視上打開後,會生成一個惟一ID,用戶用微信掃碼經過公司提供的公衆號和該電視上的該APP綁定,用戶經過公衆號打開一個H5頁面,這個頁面能夠上傳圖片或者視頻到服務器,服務器檢測到該用戶和某個屏幕的APP綁定,動態把用戶發送的圖片或者視頻發送到電視播放。
這樣一個功能是很好的體驗,可是耗費服務器資源、遠端上傳、遠端下載也都須要時間,還不如我直接用U盤拷貝到電視呢。那麼若是我經過網頁在局域網直接把視頻或者圖片發送到電視上的APP播放,豈不是更加直接快捷?github
固然大部分同窗可能不多接觸到APP之間互相在局域網通訊、局域網上傳下載、局域網登陸這樣的需求,還有不少栗子我就不舉了,下面開始正式安利。web
基本上和Java的Servlet同樣的功能,若是你作過Java開發或者其它語言的Web開發應該就很熟悉了。服務器
Gradle微信
compile 'com.yanzhenjie:andserver:1.0.2'複製代碼
Maven網絡
<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();複製代碼
AndServer andServer = new AndServer.Build()
.port(8080) // 默認是8080,Android平臺容許的端口號均可以。
.timeout(10 * 1000) // 默認10 * 1000毫秒。
...
.build();
...複製代碼
部署網站是經過Website
接口,你也能夠本身實現這個接口,固然AndServer
已經提供了兩個默認實現:
若是用上面兩個實現註冊你的網站,那麼你的默認首頁(index.html
)是:
http://ip:port/
http://ip:port/youPath
http://ip:port/youPath/index.html複製代碼
Wesite wesite = new AssetsWebsite(AssetManager, youPath);
// 或者
Wesite wesite = new StorageWebsite(youPath);
AndServer andServer = new AndServer.Build()
...
.website(wesite);
.build();複製代碼
若是你的網站在assets
下,那麼你就用AssetsWebsite
來部署你的網站。
使用方法是:
//AssetManager不能被關閉。
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
來部署你的網站,好比你的網站在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
的道理相同。
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);
// Request params.
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);
}
}
}複製代碼
而後在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
的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() {
// 服務器中止了,通常是開發者調用server.stop()纔會中止。
}
@Override
public void onError(Exception e) {
// 服務器啓動發生錯誤,通常是端口被佔用。
}
};
AndServer andServer = new AndServer.Build()
...
.listener(mListener)
.build();複製代碼
若是你以爲還不錯,請關注個人微信公衆號吧