Android 摆设web服务器

打印 上一主题 下一主题

主题 1016|帖子 1016|积分 3052

简介

AndServer 是一个轻量级的 Android Web 服务器库,它答应开发者在 Android 装备上构建和运行 Web 应用程序。AndServer 是由严振杰开发的一个轻量级 Android Web 服务器库,它类似于 Apache 或 Tomcat,但是专门为 Android 设计,无需额外的第三方库或硬件编译。它体积小、利用简单,支持动态网站、静态网站以及 HTTP API。
其特点有:
SpringMVC 风格的注解支持: AndServer 2.0 引入了类似 SpringMVC 的注解 API,使得接口定义更加简洁。
静态资源托管: 通过 AssetsWebsite 或 StorageWebsite 轻松托管 HTML、CSS、JavaScript 等静态文件。
HTTPS 支持: 可通过配置 SSL 证书实现加密通信。
拦截器与过滤器: 利用拦截器(Interceptor)和过滤器(Filter)实现日志纪录、权限检查等高级功能。
引入及配置

1.为项目引入AndServer

Android 项目根目录的build.gradle中添加 AndServer 插件引入:
  1. // Top-level build file where you can add configuration options common to all sub-projects/modules.
  2. buildscript {
  3.     dependencies {
  4.         //AndServer插件配置
  5.         classpath('com.yanzhenjie.andserver:plugin:2.1.12')
  6.     }
  7. }
  8. plugins {
  9.     id 'com.android.application' version '8.0.2' apply false
  10.     id 'com.android.library' version '8.0.2' apply false
  11. }
复制代码
app目录的build.gradle中添加依靠:
  1. plugins {
  2.     ...
  3.     id 'com.yanzhenjie.andserver'
  4. }
  5. ...
  6. dependencies {
  7.     implementation 'com.yanzhenjie.andserver:api:2.1.12'
  8.     annotationProcessor 'com.yanzhenjie.andserver:processor:2.1.12'
  9. }
复制代码
2.添加网络权限

AndroidManifest.xml中添加:
  1.     <uses-permission android:name="android.permission.INTERNET" />
复制代码
服务器启动与制止

在 AndServer 中,只需要启动服务器即可,别的组件 AndServer 会自动加载。AndServer 的服务器的启动是在子线程中进行的,因此服务器的启动乐成与否,必须利用监听器。
  1. public void startWebServer(){
  2.         server = AndServer.webServer(MainActivity.this)
  3.                 .port(8080)
  4.                 .timeout(10, TimeUnit.SECONDS)
  5.                 .listener(new Server.ServerListener() {
  6.                     @Override
  7.                     public void onStarted() {
  8.                         Log.d("AndServer","~onStarted");
  9.                     }
  10.                     @Override
  11.                     public void onStopped() {
  12.                         Log.d("AndServer","~onStopped");
  13.                     }
  14.                     @Override
  15.                     public void onException(Exception e) {
  16.                         Log.d("AndServer","~onException",e);
  17.                     }
  18.                 })
  19.                 .build();
  20.         server.startup();
  21.     }
  22.     public void shutdownWebServer(){
  23.         if(server!=null&&server.isRunning()){
  24.             server.shutdown();
  25.         }
  26.     }
复制代码
摆设网站

AndServer 没有规定静态文件(网页、文件等)应该放在哪个位置,所以我们需要通过配置的方式告诉 AndServer 静态网站的位置在哪里,我们需要利用到WebConfig接口和Config注解。
  1. @Config
  2. public class WebsiteConfig implements WebConfig {
  3.     @Override
  4.     public void onConfig(Context context, Delegate delegate) {
  5.         // 增加一个位于assets的web目录的网站,不指定indexFileName时,默认为index.html
  6.         delegate.addWebsite(new AssetsWebsite(context, "/web/"/*,indexFileName*/));
  7.         // 增加一个位于/sdcard/Download/AndServer/目录的网站,不指定indexFileName时,默认为index.html
  8.         delegate.addWebsite(new StorageWebsite("/sdcard/Download/AndServer/"/*,indexFileName*/));
  9.     }
  10. }
复制代码
摆设网站需要利用Website抽象类,AndServer提供了两个默认实现AssetsWebsite和StorageWebsite,当然你也可以根据需要自通过这个抽象类来实现。
   上述/web/目录和/sdcard/Download/AndServer/目录就是网站根目录,它们的访问路径如http://192.168.1.1:8080/,默认访问index.html,如果要访问目录下的test.txt文件,那么访问的路径是http://192.168.1.1:8080/test.txt。
  如果想要浏览装备目录文件,可以这样摆设.
  1. @Config
  2. public class WebsiteConfig implements WebConfig {
  3.     @Override
  4.     public void onConfig(Context context, Delegate delegate) {
  5.         // 添加一个文件浏览器网站
  6.         delegate.addWebsite(new FileBrowser("/sdcard/"));
  7.     }
  8. }
复制代码
运行之后,通过浏览器打开网站根目录,就可以看到文件浏览器了。
摆设Http服务器

HTTP API 在本领上分位两大类,一类是返回数据类型,在AndServer中约定把它叫做 RESTful 风格 HTTP API,另一类是重定向类型,在AndServer中约定把它叫做非 RESTful 风格 HTTP API。
1.RESTful 风格的 HTTP API

  1. @RestController
  2. class MyController {
  3.     @GetMapping("/hello")
  4.     public String hello(@RequestParam("name") String name) {
  5.         return "Hello " + name;
  6.     }
  7.    
  8. }
复制代码
该 API 的请求地点如http://192.168.1.1:8080/hello,请求方法是GET,客户端需带上name请求,请求后返回“Hello $name”,默认情况下的响应码是 200。
  1. @RestController
  2. class MyController {
  3.     @PostMapping("/userInfo")
  4.     User login(@RequestParam("id") String id) {
  5.         User user = new User();
  6.         user.setId(id);
  7.         user.setName("大耳猫");
  8.         return user;
  9.     }
  10.    
  11. }
复制代码
在 RestController 中,返回值可以是 String、可以是 Model 对象大概文件等。
2.非 RESTful 风格的 API

如果我们想让用户访问http://192.168.1.1:8080/时现实请求的是http://192.168.1.1:8080/index.html:
  1. @Controller
  2. class MyController {
  3.     @GetMapping("/")
  4.     public String visitIndex() {
  5.         return "forward:/index.html";
  6.     }
  7. }
复制代码
return 返回值中的forward:表示在服务器内部转发,forward:/index.html则表示转发到根目录下的index.html页面。
如果我们不想在服务器内部做转发,而是想发一个重定向响应,让客户端重新请求另一个 API,那么只需要把关键词forward改成redirect即可:
  1. @Controller
  2. class MyController {
  3.     @ResponseBody
  4.     @GetMapping("/project/info")
  5.     public String newInfo() {
  6.         return "I am new api.";
  7.     }
  8.     @GetMapping("/projectInfo")
  9.     public String oldInfo() {
  10.         return "redirect:/project/info";
  11.     }
  12. }
复制代码
现在,几个简单的 HTTP API 就写完了,你不需要任何注册大概配置,只需要启动服务器就可以通过浏览器访问上面的几个 HTTP API 。
配置SSH

在 AndServer 中配置 SSH(Secure Shell)主要涉及到启用 HTTPS 协议,因为 SSH 通常是指在服务器和客户端之间建立安全连接的协议,而在 Web 服务器的上下文中,这通常意味着利用 HTTPS 来加密 HTTP 通信。以下是怎样在 AndServer 中配置 HTTPS 的简单步调和示例代码:


  • 天生 SSL 证书:你需要一个 SSL 证书来启用 HTTPS。可以利用 Java 的 keytool 命令行工具天生自签名证书,大概购买一个由证书颁发机构签发的证书。
  • 创建 SSL 上下文:利用天生的 SSL 证书创建一个 SSLContext 实例。
  • 配置 AndServer:在创建 AndServer 实例时,通过 .ssl(sslContext) 方法配置 SSL 上下文。
示例代码:
  1.    public void startWebServer(){
  2.         SSLContext sslContext = null;
  3.         try {
  4.             // 创建 SSL 上下文
  5.             sslContext = SSLContext.getInstance("TLS");
  6.             sslContext.init(null, null, null);
  7.         }catch (Exception e){
  8.             e.printStackTrace();
  9.         }
  10.         server = AndServer.webServer(MainActivity.this)
  11.                 .port(8080)
  12.                 .timeout(10, TimeUnit.SECONDS)
  13.                 .sslContext(sslContext) //配置sslContext
  14.                 .serverSocketFactory(sslContext.getServerSocketFactory())
  15.                 .sslSocketInitializer(new SSLSocketInitializer() {
  16.                     @Override
  17.                     public void onCreated(@NonNull SSLServerSocket socket) throws SSLException {
  18.                         Log.d("AndServer","~sslSocketInitializer onCreated");
  19.                     }
  20.                 })
  21.                 .listener(new Server.ServerListener() {
  22.                     @Override
  23.                     public void onStarted() {
  24.                         Log.d("AndServer","~onStarted");
  25.                     }
  26.                     @Override
  27.                     public void onStopped() {
  28.                         Log.d("AndServer","~onStopped");
  29.                     }
  30.                     @Override
  31.                     public void onException(Exception e) {
  32.                         Log.d("AndServer","~onException",e);
  33.                     }
  34.                 })
  35.                 .build();
  36.         server.startup();
  37.     }
复制代码
在上面的代码中,SSLContext 是一个包含 SSL 证书的 SSL 上下文对象,将其传递给AndServer的构建器来启用 HTTPS。
请注意,自签名证书通常只用于测试目的,因为它不受信托的证书颁发机构签发,大概会在浏览器中引起安全警告。在生产情况中,建议利用由受信托的证书颁发机构签发的证书。
总结

总的来说,AndServer 提供了一个在 Android 装备上快速搭建 Web 服务的解决方案,无论是静态资源托管照旧动态 API 开发,都能提供有效的支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表