首页 > 其他分享 >AndServer流程和使用方法

AndServer流程和使用方法

时间:2024-02-28 14:11:07浏览次数:32  
标签:AndServer 流程 request 调用 StorageWebsite apache new 方法 response

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

 

标签:AndServer,流程,request,调用,StorageWebsite,apache,new,方法,response
From: https://www.cnblogs.com/adamli/p/18040238

相关文章

  • 模拟量系数计算方法(y = ax + b)
    客户测量范围是M—N(M < N),采集数据范围X—Y(X < Y)计算公式:y = ax + bM = Xa + b N = Ya + b 得:N - M = (Y - X)a 进一步可得:a = (N - M)/ (Y - X)利用二元一次方程可得 b 的值 测量水的深为例:(1)水的测量范围为0-10米,(2)模拟量转485为低精度(4-20mA,数据采......
  • 《系统科学方法概论》第一章读后感
    首先,这一章让我对系统科学有了更深入的认识。系统科学是一门研究复杂系统的学科,它关注的是系统的整体性、关联性和动态性。通过学习,我了解到系统科学的基本原理包括整体性原理、关联性原理和动态性原理,这些原理为我们提供了分析和解决问题的新视角。在整体性原理方面,我认识到任何......
  • 系统科学方法绪论
    (一)系统科学是以系统为研究对象的学科群系统科学,顾名思义,即以系统为研究对象的科学。但由于研究角度的不同,它又分为三个方面的内容:系统论。主要研究的对象是系统的本质,特征,变化规律以及系统方法等问题。主要分支学科包括:普通系统论,系统工程学,系统动力学,自组织系统理论,复杂系统理......
  • 方法概论读后感1
    《系统科学方法概论》第一章读后感在阅读了《系统科学方法概论》的第一章后,我深感这是一个引领我进入全新知识领域的旅程。作为一个对跨学科研究充满热情的读者,我认识到系统科学不仅仅是一种理论体系,更是一种全新的思考方式。首先,我被系统科学的核心概念所吸引,如整体性、相互关......
  • 方法概论读后感2
    《系统科学方法概论》第二章读后感在深入阅读了《系统科学方法概论》的第二章之后,我对系统科学有了更为丰富和深入的理解。这一章节不仅为我提供了系统科学的入门级指导,更为我展示了该领域的魅力及其在实际应用中的重要性。我被系统科学的重要性所震撼。在现代社会中,我们面临着......
  • 系统科学方法概论读后感3
    在阅读了《系统科学方法概论》第三章之后,我深感系统科学方法在解决实际问题中的重要作用。这一章节详细介绍了系统科学方法论在各个领域的应用,包括社会科学、自然科学、工程技术等多个方面。通过学习,我对系统科学方法论有了更深入的认识和理解,也更加明白了其在解决实际问题中的关......
  • 系统科学方法概论读后感4
    《系统科学方法概论》第四章读后感阅读完《系统科学方法概论》的第四章后,我深受启发,对计算机控制方法在现代社会中的重要性有了更深的认识。我被计算机控制方法的精妙和复杂性所吸引。这种控制方法不仅仅是一门科学,更像是一门艺术。通过学习,我逐渐理解到计算机控制方法在多个领......
  • 解决HttpServletRequest调用getInputStream()方法读取参数只能获取一次问题
    1、问题描述由于后端接口获取前端传过的参数是通过HttpServletRequest接收获取的。现有一需求需要在接口调用之前拦截接口进行业务处理。在拦截类中调用getInputStream()获取参数之后,在接口方法里获取参数为空。2、解决方法自定义一个过滤器过滤所有请求,使用HttpServletRequest......
  • 《系统科学方法》第四章控制方法
    阅读了《系统科学方法概论》第四章“控制方法”,让我对控制方法的重要性有了更深的认识。这一章节主要介绍了系统控制的基本原理、方法和应用,给我留下了深刻的印象。第一节中,介绍了系统控制的概念和基本原理。系统控制是指通过对系统的输入和输出进行调节,使系统达到适当的状态或行......
  • 第二章——系统工程方法
    读完《系统科学方法概论》第二章,我对系统工程有了更清晰的认识。系统工程是一种跨学科的方法,用于解决复杂的系统问题。通过对系统工程发展史的学习,我了解到它是在实践中不断发展和完善的。霍尔三维结构法和计划协调技术是系统工程中常用的方法。霍尔三维结构法从时间、逻辑、和知......