Android 搭建HTTP服务器--AndServer

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

 

Android 搭建HTTP服务器--AndServer

上一篇:Android 控件三 TextView 控件实现 Button


下一篇:华为智慧助手·今天:购物真不用直接打开app