您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

AndServer配置

时间:02-08来源:作者:点击数:

AndServer的Github地址:https://github.com/yanzhenjie/AndServer,文档地址:https://yanzhenjie.com/AndServer/

  1. 在项目build.gradledependencies中添加一个插件,如下:
    buildscript {
        repositories {
            google()
            mavenCentral()
        }
        dependencies {
            。。。
            classpath 'com.yanzhenjie.andserver:plugin:2.1.9' // AndServer
        }
    }
    
  2. 在模块的build.gradle中应用AndServer插件和kapt插件,如下:
    plugins {
        id 'com.android.application'
        id 'kotlin-android'
        id 'kotlin-kapt'
        id 'com.yanzhenjie.andserver' // AndServer
    }
    
  3. 在模块的build.gradle中添加AndServer相关依赖,如下:
    dependencies {
        。。。
        // AndServer
        implementation 'javax.activation:javax.activation-api:1.2.0'
        implementation 'com.yanzhenjie.andserver:api:2.1.9'
        kapt 'com.yanzhenjie.andserver:processor:2.1.9'
    }
    

    注:这里的activation-api依赖在AndServer官网中并没有添加,因为官网的使用环境是jdk1.8,当我们的项目使用jdk11的时候,在processor库中的com.yanzhenjie.andserver.processor.ControllerProcessor类里面用到了javax.activation.MimeTypeParseException类,这个类在JDK1.8中是存在的,而在JDK11的时候就被删除掉了,在编译的时候会报如下警告:

    Task :app:kaptDebugKotlin

    [WARN] Can’t find annotation processor class com.yanzhenjie.andserver.processor.ControllerProcessor: javax/activation/MimeTypeParseException

    编译报了这个警告,但程序可以正常运行,只是在客户端请求接口时就请求不到了,比如访问:http://192.168.1.75:8899/user/login接口,这个接口我们是已经做好了的,但是会提示找不到这个接口,如下:

    The resource [/user/login] is not found.

    所以,当我们使用JDK11或更高的JDK版本时,需要添加activation-api依赖。

  4. 相关实现类

    import android.util.Log
    import com.yanzhenjie.andserver.AndServer
    import com.yanzhenjie.andserver.Server
    import java.lang.Exception
    import java.util.concurrent.TimeUnit
    
    object AndServerEngine {
    
        private var mAndServer: Server? = null
    
        fun startup() {
            if (mAndServer?.isRunning == true) {
                Log.i("ABCD", "AndServer已经启动")
                return
            }
    
            AndServer
                .webServer(App.sContext)
                .port(8899)
                .timeout(10, TimeUnit.SECONDS)
                .listener(object : Server.ServerListener {
                    override fun onStarted() {
                        Log.i("ABCD", "AndServer启动成功")
                    }
    
                    override fun onStopped() {
                        Log.i("ABCD", "AndServer关闭成功")
                    }
    
                    override fun onException(e: Exception?) {
                        Log.i("ABCD", "AndServer出现异常", e)
                    }
    
                })
                .build()
                .apply {
                    mAndServer = this
                    startup()
                }
        }
    
        fun shutdown() {
            val server = mAndServer
            if (server?.isRunning == true) {
                server.shutdown()
                mAndServer = null
            } else {
                Log.i("ABCD", "AndServer没有启动")
            }
        }
    
    }
    
    import android.util.Log
    import com.yanzhenjie.andserver.annotation.RestController
    import com.yanzhenjie.andserver.annotation.RequestMapping
    import com.yanzhenjie.andserver.annotation.GetMapping
    import com.yanzhenjie.andserver.annotation.QueryParam
    
    @RestController
    @RequestMapping(path = ["/user"])
    class UserController {
    
        @GetMapping("/login")
        fun login(@QueryParam("account") account: String?, @QueryParam("password") password: String?): String {
            Log.i("ABCD", "收到登录请求,account = $account,password = $password")
            return "Successful!"
        }
    
    }
    
    这里,我们通过AndServerEngine来控制AndServer的启动关闭,通过UserController来定义相关的请求接口,这里有一个需要注意的细节是,Get请求的参数注解是QueryParam,而Post请求的参数注解是RequestParam
    然后我们在主界面添加两个按钮,如下:
    在这里插入图片描述
    然后设置一下点击事件:
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            findViewById<Button>(R.id.startBtn).setOnClickListener { AndServerEngine.startup() }
            findViewById<Button>(R.id.stopBtn).setOnClickListener { AndServerEngine.shutdown() }
        }
    }
    

    最后,不要忘了在清单文件中设置一下网络权限,如下:

    <uses-permission android:name="android.permission.INTERNET"/>
    
  5. 找台电脑,要和手机在相同的局域网中,然后在浏览器上访问:
    http://192.168.1.75:8899/user/login?account=ZhangShan&password=123456
    
    效果如下:
    在这里插入图片描述
    完整代码:https://gitee.com/daizhufei/and-server-demo
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门