前言
其實(shí)主要討論的是android中的RPC,但是在這之前我們得在Android中搭建一個(gè)HTTP服務(wù)器,來供我們遠(yuǎn)程訪問。
NanoHTTPD是一個(gè)免費(fèi)、輕量級(jí)的(只有一個(gè)Java文件) HTTP服務(wù)器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 請(qǐng)求,支持文件上傳,占用內(nèi)存很小??奢p松定制臨時(shí)文件使用和線程模型。
git地址:
https://github.com/NanoHttpd/nanohttpd
Server搭建
引入相關(guān)依賴
implementation 'org.nanohttpd:nanohttpd:2.3.1'
implementation 'com.github.briandilley.jsonrpc4j:jsonrpc4j:1.5.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
創(chuàng)建我們的服務(wù)類
public class MyServer extends NanoHTTPD {
private Context mContext;
private final static int PORT = 33445;
public final static String TAG = "SharkChilli";
public MyServer(Context context) throws IOException {
super(PORT);
this.mContext = context;
start();
Log.i(TAG, "MyServer start");
}
@Override
public Response serve(IHTTPSession session) {
//打印請(qǐng)求數(shù)據(jù)
Log.i(TAG, "serve uri: " + session.getUri());
Log.i(TAG, "serve getQueryParameterString: " + session.getQueryParameterString());
Log.i(TAG, "serve getRemoteHostName: " + session.getRemoteHostName());
Log.i(TAG, "serve getRemoteIpAddress: " + session.getRemoteIpAddress());
session.getHeaders().forEach((key, val) -> {
Log.i(TAG, key + " : " + val);
});
InputStream inputStream = session.getInputStream();
// ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
String msg = "<html><body><h1>Hello server</h1></body></html>";
return newFixedLengthResponse(msg);
} catch (Exception exception) {
return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Internal Server Error!!!");
}
}
}
這里我們繼承了NanoHTTPD并且覆蓋了serve方法,在構(gòu)造方法中調(diào)用了 super(PORT);用于監(jiān)聽指定端口。
以后外部的所以訪問都會(huì)調(diào)用serve方法。IHTTPSession 中封裝了本次請(qǐng)求的相關(guān)信息,在這一段代碼中我打印了一些信息。
最后調(diào)用newFixedLengthResponse返回固定長(zhǎng)度的結(jié)果
Activity啟動(dòng)服務(wù)
public class MainActivity extends AppCompatActivity {
public final static String TAG = "SharkChilli";
private MyServer mMyServer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mMyServer = new MyServer(this);
} catch (IOException e) {
Log.e(TAG, "WebServer start failed", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMyServer != null) {
mMyServer.closeAllConnections();
mMyServer = null;
Log.e(TAG, "app pause, so web server close");
}
}
}
上面代碼就是onCreate啟動(dòng)服務(wù),onDestroy關(guān)閉服務(wù)。其實(shí)這個(gè)步驟應(yīng)該在Application中處理,這里為了方便就先這樣了。
運(yùn)行
啟動(dòng)app后訪問收集app的ip

image.png