最近公司有一个项目需求,需要在android设备上运行一个小型的web服务器,经过查找资料,最后选定andserver作为项目框架,成功实现了相关功能
提醒:如果你不能看懂框架的代码和意思,那你会变的一头雾水,无从下手,我的建议是首先手打代码,然后理解代码逻辑,通信的本质在于注解
1.添加依赖
build.gradle
//AndServer
implementation 'com.yanzhenjie.andserver:api:2.0.5'
annotationProcessor 'com.yanzhenjie.andserver:processor:2.0.5'
implementation 'com.yanzhenjie:loading:1.0.0'
implementation group: 'com.alibaba', name: 'fastjson', version: '1.1.70.android'
implementation 'org.apache.commons:commons-lang3:3.8'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.code.gson:gson:2.8.0'
2.添加权限,启动服务
AndroidManifest
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3.启动服务,配置ip和端口号,设置超时time,并且有三个回调方法,监听服务启动情况
CoreService
@Override
public void onCreate() {
super.onCreate();
mServer = AndServer.serverBuilder(this)
.inetAddress(NetUtils.getLocalIPAddress())
.port(8080)
.timeout(10, TimeUnit.SECONDS)
.listener(new Server.ServerListener() {
@Override
public void onStarted() {
String hostAddress = mServer.getInetAddress().getHostAddress();
ServerManager.onServerStart(CoreService.this, hostAddress);
}
@Override
public void onStopped() {
ServerManager.onServerStop(CoreService.this);
}
@Override
public void onException(Exception e) {
ServerManager.onServerError(CoreService.this, e.getMessage());
}
})
.build();
}
4.接下来重点讲一下注解,前面的都是写ui布局,然后开启服务,这些代码网上一大堆,你们可以自己寻找,我讲一下注解,andserver中网页端称之为前端,android端称之为后端,后端的接收方法是LoggerInterceptor文件,重写onIntercept,有三个值,path表示路径 method表示请求方式 valueMap表示请求体的内容,这个请求体是前端发送给后端,后端进行接收的方法
LoggerInterceptor
@Interceptor
public class LoggerInterceptor implements HandlerInterceptor {
@Override
public boolean onIntercept(@NonNull HttpRequest request, @NonNull HttpResponse response, @NonNull RequestHandler handler) throws Exception {
String path = request.getPath();
HttpMethod method = request.getMethod();
MultiValueMap<String,String> valueMap=request.getParameter();
//path表示 网页端请求路径,这个路径需要跟服务端一一对应
// method表示请求的方式
//params表示网页端向服务端请求的内容
//这三个字段务必不能为空,如果为空 表示网页端与服务端 通信不成功
//搞不懂 这个地方他做了封装处理 反正就是能接收到 网页端发送过来的各种消息
Log.e("TAG","LoggerInterceptor=path:"+path);
Log.e("TAG","LoggerInterceptor=method:"+method.value());
Log.e("TAG","LoggerInterceptor=param:"+ JsonUtils.toJsonString(valueM