其實(shí)這一篇跟其他人寫的也差不多惊完,所以如果你對(duì)nanoHTTPD了解的話躯保,可以先第二篇開始看飞苇。
想沒想過在自己的android app里內(nèi)嵌一個(gè)http server缎讼,這樣咱們就可以從PC和手機(jī)上的瀏覽器遙控app了收夸。(想想都有點(diǎn)興奮有沒有!)
好血崭,下面咱們就嘗試用nanoHTTPD做個(gè)app端的http server卧惜。
1. nanoHTTPD是啥?為啥用它夹纫?
人家官網(wǎng)上是這么說滴:NanoHTTPD is a light-weight HTTP server designed for embedding in other applications咽瓷。
翻譯成中文就是:專門用來嵌入到app里提供http服務(wù)的。
聽著巨牛是吧舰讹,人家的實(shí)現(xiàn)也很牛茅姜,所有實(shí)現(xiàn)都提供在一個(gè)文件(NanoHTTPD.java)里,真心是nano霸孪弧钻洒!所以不用它,你說用誰锄开?
2. 如何嵌入素标?
- 在build.gradle中增加一個(gè)依賴(已經(jīng)懶到一定境界了,能自動(dòng)的萍悴,絕不手動(dòng)下載配置):
compile 'org.nanohttpd:nanohttpd:2.2.0'
在項(xiàng)目里增加一個(gè)新的package:
WebServer
头遭;在包里增加一個(gè)java文件:
MyServer.java
:
import fi.iki.elonen.NanoHTTPD;
public class MyWebServer extends NanoHTTPD {
private final static int PORT = 33445;
private Context _mainContext;
/*
主構(gòu)造函數(shù),也用來啟動(dòng)http服務(wù)
*/
public MyWebServer(Context context) throws IOException {
super(PORT);
_mainContext = context;
start();
System.out.println("\nRunning! Point your browsers to [http://0.0.0.0:33445/](http://localhost:33445/)\n");
}
/*
解析的主入口函數(shù)癣诱,所有請(qǐng)求從這里進(jìn)计维,也從這里出
*/
@Override
public Response serve(IHTTPSession session) {
String msg = "<html><body><h1>Hello server</h1>\n";
msg += "<p>We serve " + session.getUri() + " !</p>";
return newFixedLengthResponse( msg + "</body></html>\n" );
}
}
- 在MainActivity.java中增加兩個(gè)重載函數(shù),用來啟動(dòng)服務(wù)和中止服務(wù):
public class MainActivity extends AppCompatActivity {
private MyWebServer mywebserver;
@Override
public void onResume() {
super.onResume();
try {
mywebserver = new MyWebServer(this);
Log.e("onResume", "WebServer started");
} catch (IOException e) {
e.printStackTrace();
Log.e("onResume", "WebServer start failed" + e.getMessage());
}
}
@Override
public void onPause() {
super.onPause();
if (mywebserver != null) {
mywebserver.closeAllConnections();
mywebserver = null;
Log.e("onPause", "app pause, so web server close");
}
}
}
- 在AndroidManifest.xml中撕予,增加對(duì)網(wǎng)絡(luò)訪問的權(quán)限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
- OK鲫惶,基本的架子搭起來了。
為啥說是只是個(gè)架子嗅蔬,因?yàn)檫@個(gè)時(shí)候你把a(bǔ)pp跑起來以后剑按,雖然可以在瀏覽器里看到網(wǎng)頁了疾就,但實(shí)際開發(fā)起來就會(huì)發(fā)現(xiàn)這個(gè)架子基本不可用。為啥呢艺蝴?因?yàn)檫@里的網(wǎng)頁是用字符串拼接起來的呀猬腰!如果要寫個(gè)稍微復(fù)雜一點(diǎn)的頁面,這種字符串拼接的方法一會(huì)把你累死猜敢,二會(huì)把你累死姑荷,三還是會(huì)把你累死的。
所以呢缩擂,咱們最好讓程序能讀取html鼠冕,js,css文件胯盯,就才具備一點(diǎn)可用性對(duì)不對(duì)懈费?
咱們下一篇文章就開始解決這些問題。