Android 搭建HTTP服务器--AndServer
概述
AndServer是Android平台的Web Server和Web Framework。 它基于编译时注解提供了类似SpringMVC的注解和功能,如果您熟悉SpringMVC,则可以非常快速地掌握它。
特性
- 部署静态网站
- 使用注解开发Http Api
- 全局请求拦截器,使用注解,全局多个
- 全局异常处理器,使用注解,全局唯一
- 全局消息转换器,使用注解,全局唯一
依赖
添加依赖时请替换下述 {version} 字段为 Github上公开的最新版本号。
dependencies {
implementation ‘com.yanzhenjie.andserver:api:{version}‘
annotationProcessor ‘com.yanzhenjie.andserver:processor:{version}‘
}
服务器(Server)
一个WebServer必须要涉及到的点是启动、停止、网络地址与端口监听、连接超时配置、SSL、状态监听、Socket的一些优化配置等,AndServer也提供了这些能力。
在AndServer中,只需要启动服务器即可,其它组件AndServer会自动加载。AndServer的服务器的启动是在子线程中进行的,因此服务器的启动成功与否,必须使用监听器
下面是针对AndServer的服务器管理示例代码:
public class ServerManager { private static final String TAG = "ServerManager"; private Server mServer; /** * Create server. */ public ServerManager(Context context) { InetAddress inetAddress = null; try { inetAddress = InetAddress.getByName(NetInfo.getIpAddress(context)); //获取IP地址 Log.d(TAG, "ServerManager: getIpAddress ="+NetInfo.getIpAddress(context)); } catch (UnknownHostException e) { e.printStackTrace(); } mServer = AndServer.serverBuilder(context) .inetAddress(inetAddress) //地址 .port(8080) //端口 .timeout(10, TimeUnit.SECONDS) //延迟10s .listener(new Server.ServerListener() { //监听Server @Override public void onStarted() { // TODO The server started successfully. Log.d(TAG, "onStarted: "); } @Override public void onStopped() { // TODO The server has stopped. Log.d(TAG, "onStarted: "); } @Override public void onException(Exception e) { Log.e(TAG, "onException: ",e ); // TODO An exception occurred while the server was starting. } }) .build(); } /** * Start server. */ public void startServer() { if (mServer.isRunning()) { // TODO The server is already up. } else { mServer.startup(); } } /** * Stop server. */ public void stopServer() { if (mServer.isRunning()) { mServer.shutdown(); } else { Log.w("AndServer", "The server has not started yet."); } } }
上文中有一段伪代码,作用是生成一个网络地址,一般我们都绑定本机在局域网中的IP地址。当然,如果你的设备有一个外网IP,你可以用外网IP来生成一个网络地址。
InetAddress inetAddress = ...;
例如,使用某个IP生成网络地址:
InetAddress inetAddress = InetAddress.getByName("192.168.1.11");
例如,使用某个域名生成网络地址:
InetAddress inetAddress = InetAddress.getByName("www.xxx.com");
服务(Services)
在应用后台启动一个Services,用于开启和关闭服务器
Services示例代码:
public class MyServer extends Service { private static final String TAG = "MyServer"; private ServerManager mServerManager; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate: mServerManager ="+mServerManager); if (mServerManager==null){ mServerManager =new ServerManager(this); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand: mServerManager ="+mServerManager); mServerManager.startServer(); //开启服务器 return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); if (mServerManager!=null){ mServerManager.stopServer(); //停止服务器 } } }
HTTP API
模拟用户登录的Http Api:
@RestController public class UserController { @GetMapping("/user/login") String login(@RequestParam("account") String account, @RequestParam("password") String password) { if("123".equals(account) && "123".equals(password)) { return "Login successful."; } else { return "Login failed."; } } }
上述Http Api的请求地址是http://xxx:8080/user/login
,请求方法是GET
,客户端需带上帐号account
参数和密码password
参数,在帐号和密码都是123
时,
我们返回给客户端的数据是Login successful
,否则是Login failed
,默认情况下的响应码是200。
@RestController public class UserController { @PostMapping("/user/get") User login(@RequestParam("id") String id) { User user = new User(); user.setId(id); user.setName("AndServer"); return user; } }
在RestController中,返回值可以是String、可以是Model对象或者文件等。
你不需要任何注册或者配置,只需要启动服务器就可以通过浏览器或者测试工具访问上面的几个Http Api了。
注:需要在同一个局域网!
源码地址: https://github.com/yanzhenjie/AndServer
文档地址: https://www.yanzhenjie.com/AndServer
旧版文档: https://www.yanzhenjie.com/AndServer/1.x