AndServer流程和使用方法

AndServer提供了在 Android 设备上搭建一个 Web 服务器的源码,它可以接受客户端文件上传、下载文件,相关流程和使用方法如下:
一、客户端请求流程:
btn_browse 主界面点击浏览服务器主界面
intent 启动http://" + ip + ":8080/" 网址

二、服务启动
1服务初始化
启动了CoreService 继承 Service
mService = new Intent(activity, CoreService.class)

CoreService.onCreate()
mServer = AndServer.webServer(this)
.port(8080) //设置端口
.timeout(10, TimeUnit.SECONDS) //超时时间
..

->AndServer.webServer
WebServer.newBuilder(context, "default") mServer 即创建的 WebServer对象

WebServer 继承 BasicServer

2点击启动服务
mServerManager.startServer()
ServerManager.startServer() 调用mActivity.startService(mService) 启动服务 即:mService = new Intent(activity, CoreService.class)
service 启动会回调
CoreService.onStartCommand
CoreService.startServer() //调用 mServer.startup() mServer 即上面的WebServer对象
BasicServer.startup() 线程中调用mHttpServer = ServerBootstrap.bootstrap() 初始化 ServerBootstrap
.registerHandler("*", requestHandler()) //这个requestHandler() 方法调用的是WebServer.requestHandler()
****注意 即向 web服务器注册 监听 new DispatcherHandler ,DispatcherHandler实现了apache的HttpRequestHandler接口,所以这个类是处理http请求和响应的核心。
mHttpServer.start(); 调用apache启动服务

其中WebServer.requestHandler 调用register.register(handler, mGroup) 这个handler是DispatcherHandler,传递给了下面的register
ComponentRegister.register(Register register, String group) 中遍历 REGISTER_LIST数组,包括ConfigRegister等,调用其中的onRegister方法
ConfigRegister.onRegister 方法中
2.1.调用config.onConfig(context, delegate); config对应AppConfig,delegate对应Delegate
AppConfig.onConfig(context, delegate) 方法调用delegate.addWebsite(new StorageWebsite(carWebPath, AppConstants.INDEX_FILE_NAME));
向Delegate.mWebsites中添加StorageWebsite对象,
2.2.遍历Delegate.mWebsites列表中website 对象调用 register.addAdapter(website),这里的register即对应上面的 DispatcherHandler
DispatcherHandler.addAdapter(adapter) 调用 mAdapterList.add(adapter) 这里的adapter即website参数,即上面的 StorageWebsite,mAdapterList存储StorageWebsite列表

三、服务端接收流程:

DispatcherHandler implements HttpRequestHandler, //HttpRequestHandler 是 apache中的接口
DispatcherHandler.handle

PageControllerIndexHandler.onHandle

PageController.index() 返回 forward:/index.html

四、服务端返回数据给client
DispatcherHandler.handle(org.apache.httpcore.HttpRequest req, org.apache.httpcore.HttpResponse res,
org.apache.httpcore.protocol.HttpContext con)
HttpRequest request = new StandardRequest(req, new StandardContext(con), this, mSessionManager);
HttpResponse response = new StandardResponse(res);
handle(request, response) 将apache返回的HttpResponse和HttpRequest 封装到 HttpResponse response = new StandardResponse(res);
DispatcherHandler.handle 方法中
1.调用DispatcherHandler.getHandlerAdapter 遍历mAdapterList 即遍历上面描述的StorageWebsite列表,调用 ha.intercept(request) ,ha对应 StorageWebsite
StorageWebsite.intercept(@NonNull HttpRequest request) 调用findPathFile(httpPath),遍历当前配置路径下是否有匹配的文件,如果有返回该StorageWebsite
2.调用 RequestHandler handler = ha.getHandler(request) ha对应StorageWebsite,即调用StorageWebsite父类Website中的getHandler方法,该方法返回RequestHandler对象,
3.调用View view = handler.handle(request, response) 即Website.getHandler.RequestHandler.handle中返回的 new BodyView(getBody(request, response) ,BodyView构造函数将getBody的对象赋值给mBody
这里的getBody调用StorageWebsite.getBody 方法 根据request 获取文件路径,生成file对象targetFile, 返回new FileBody(targetFile) ,即BodyView.mBody就是request的FileBody
这里的view就是BodyView

4.调用mViewResolver.resolve(view, request, response)
ViewResolver.resolve(view, request, response)
4.1Object output = view.output(); //view就是BodyView ,BodyView.output 返回mBody,即request的FileBody对象。
4.2ViewResolver.resolveRest(output, request, response)
4.2.1判断如果是request是post请求,则调用 response.setBody(new StringBody(responseJson)) 返回字符串给客户端;
4.2.2 否则 调用 response.setBody((ResponseBody) output) output是request的FileBody对象,response是 StandardResponse,
StandardResponse.setBody(HttpEntity entity) 调用mResponse.setEntity(new BodyToEntity(body)) 即调用 apache HttpResponse.setEntity
apache HttpResponse.setEntity 将FileBody封装到BodyToEntity对象中(body是request的FileBody对象,从StorageWebsite.getBody 获取FileBody)
BodyToEntity对应的writeTo(OutputStream out) ,getContentType(),getContentLength 方法调用的事信息FileBody中对应的接口方法。
即apache HttpEntity 接口调用getContentLength 等方法调用的是FileBody中对应的接口方法。

比如:客户端反馈的 content-length可能不对可以在,StandardResponse.BodyToEntity.getContentLength 即:回调给应用的content-length,
如果是下载文件的最终是取的FileBody.contentLength 返回的要下载文件的 content-length

WebServer 继承

api中 用来调用 apache 中的 HttpServer
BasicServer
.registerHandler("*", requestHandler()) //注册handler 测试添加
.registerHandler("login", new RequestLoginHandler())
.build();复制代码现在你就得到了一个唯一的访问地址:http://ip:port/login, 例如:
http://192.168.1.12:8080/login?username=123&password=123

----------------------------------------
五、服务配置
AppConfig.onConfig ****************************************可以配置对应目录访问对应的图片资源
可以修改策略如果是get请求不拦截直接认为是下载,如果是post作拦截
配置AssetsWebsite 路径等参数
setMultipart 设置客户端上传配置信息

六、源码编译相关
AndServer 源码路径:https://github.com/yanzhenjie/AndServer
编译源码需要将引用的jdk版本修改成1.8,gradle 版本设置成6.7.1

 

posted @ 2024-02-28 14:10  adam.li  阅读(370)  评论(0编辑  收藏  举报