前言
其实主要讨论的是android中的RPC,但是在这之前我们得在Android中搭建一个HTTP服务器,来供我们远程访问。
NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。可轻松定制临时文件使用和线程模型。
git地址:
https://github.com/NanoHttpd/nanohttpd
Server搭建
引入相关依赖
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'
创建我们的服务类
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) {
//打印请求数据
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方法,在构造方法中调用了 super(PORT);用于监听指定端口。
以后外部的所以访问都会调用serve方法。IHTTPSession 中封装了本次请求的相关信息,在这一段代码中我打印了一些信息。
最后调用newFixedLengthResponse返回固定长度的结果
Activity启动服务
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启动服务,onDestroy关闭服务。其实这个步骤应该在Application中处理,这里为了方便就先这样了。
运行
启动app后访问收集app的ip
image.png
网友评论