刚刚接触AndServer,感觉可以做很多事情,简单的梳理一下使用的逻辑,毕竟也是刚刚接触,对AndServer的理解还很浅显。感觉云控群控可以搞一搞,搭配上appium之类的。

1.项目中使用到的依赖

implementation 'com.google.code.gson:gson:2.8.0'
//这两个是AndServer中必须要用到的
implementation 'com.yanzhenjie.andserver:api:2.1.9'
annotationProcessor 'com.yanzhenjie.andserver:processor:2.1.9'

并且需要在项目model中的gradle添加

apply plugin: 'com.android.application'
//加上就行了
apply plugin: 'com.yanzhenjie.andserver'

然后是项目中的gradle

buildscript {repositories {...google { url 'https://maven.aliyun.com/repository/google' }jcenter { url 'https://maven.aliyun.com/repository/jcenter' }mavenCentral { url 'https://maven.aliyun.com/repository/central' }}dependencies {...classpath 'com.yanzhenjie.andserver:plugin:2.1.9'}
}allprojects {repositories {...google { url 'https://maven.aliyun.com/repository/google' }jcenter { url 'https://maven.aliyun.com/repository/jcenter' }mavenCentral { url 'https://maven.aliyun.com/repository/central' }}
}

然后,编译时遇到个小麻烦,AndServer支持的gradle版本最小应该是5.6.4
自己在 gradle-wrapper.properties文件中修改一个就可以了。

2.两个我用到的工具类。
当然是从人家示例中直接拿来主义的,其中还有不少其他的东西,由于暂时用不到所以,就不贴了。

public class FileUtils {/*** SD is available.** @return true, otherwise is false.*/public static boolean storageAvailable() {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File sd = new File(Environment.getExternalStorageDirectory().getAbsolutePath());return sd.canWrite();} else {return false;}}
}
public class NetUtils {/*** Ipv4 address check.*/private static final Pattern IPV4_PATTERN = Pattern.compile("^(" + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" +"([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");/*** Check if valid IPV4 address.** @param input the address string to check for validity.** @return True if the input parameter is a valid IPv4 address.*/public static boolean isIPv4Address(String input) {return IPV4_PATTERN.matcher(input).matches();}/*** Get local Ip address.*/public static InetAddress getLocalIPAddress() {Enumeration<NetworkInterface> enumeration = null;try {enumeration = NetworkInterface.getNetworkInterfaces();} catch (SocketException e) {e.printStackTrace();}if (enumeration != null) {while (enumeration.hasMoreElements()) {NetworkInterface nif = enumeration.nextElement();Enumeration<InetAddress> inetAddresses = nif.getInetAddresses();if (inetAddresses != null) {while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (!inetAddress.isLoopbackAddress() && isIPv4Address(inetAddress.getHostAddress())) {return inetAddress;}}}}}return null;}
}

3.然后是Service用来启动AndServer的

public class CoreService extends Service {private Server mServer;@Overridepublic void onCreate() {mServer = AndServer.webServer(this).port(8080)//端口号.timeout(10, TimeUnit.SECONDS)//超时时间 单位.listener(new Server.ServerListener() {//监听AndServer状态@Overridepublic void onStarted() {InetAddress address = NetUtils.getLocalIPAddress();AndServerManage.onServerStart(CoreService.this, address.getHostAddress());}@Overridepublic void onStopped() {AndServerManage.onServerStop(CoreService.this);}@Overridepublic void onException(Exception e) {e.printStackTrace();AndServerManage.onServerError(CoreService.this, e.getMessage());}}).build();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startServer();return START_STICKY;}@Overridepublic void onDestroy() {stopServer();super.onDestroy();}private void startServer() {mServer.startup();}private void stopServer() {mServer.shutdown();}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}
}

4.AndServer管理操作类

public class AndServerManage extends BroadcastReceiver {private static final String ACTION = "com.wsy.myapplication.receiver";private static final String CMD_KEY = "CMD_KEY";private static final String MESSAGE_KEY = "MESSAGE_KEY";private static final int CMD_VALUE_START = 1;private static final int CMD_VALUE_ERROR = 2;private static final int CMD_VALUE_STOP = 4;/*** Notify serverStart.** @param context context.*/public static void onServerStart(Context context, String hostAddress) {sendBroadcast(context, CMD_VALUE_START, hostAddress);}/*** Notify serverStop.** @param context context.*/public static void onServerError(Context context, String error) {sendBroadcast(context, CMD_VALUE_ERROR, error);}/*** Notify serverStop.** @param context context.*/public static void onServerStop(Context context) {sendBroadcast(context, CMD_VALUE_STOP);}private static void sendBroadcast(Context context, int cmd) {sendBroadcast(context, cmd, null);}private static void sendBroadcast(Context context, int cmd, String message) {Intent broadcast = new Intent(ACTION);broadcast.putExtra(CMD_KEY, cmd);broadcast.putExtra(MESSAGE_KEY, message);context.sendBroadcast(broadcast);}private MainActivity mActivity;private Intent mService;public AndServerManage(MainActivity activity) {this.mActivity = activity;mService = new Intent(activity, CoreService.class);}/*** Register broadcast.*/public void register() {IntentFilter filter = new IntentFilter(ACTION);mActivity.registerReceiver(this, filter);}/*** UnRegister broadcast.*/public void unRegister() {mActivity.unregisterReceiver(this);}public void startServer() {mActivity.startService(mService);}public void stopServer() {mActivity.stopService(mService);}@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION.equals(action)) {int cmd = intent.getIntExtra(CMD_KEY, 0);switch (cmd) {case CMD_VALUE_START: {String ip = intent.getStringExtra(MESSAGE_KEY);mActivity.onServerStart(ip);break;}case CMD_VALUE_ERROR: {String error = intent.getStringExtra(MESSAGE_KEY);mActivity.onServerError(error);break;}case CMD_VALUE_STOP: {mActivity.onServerStop();break;}}}}
}

5.MinaActivity
就是启动一下然后,改变一下布局的文字看看ip之类的没啥好说的

public class MainActivity extends AppCompatActivity {AndServerManage andServerManage;private TextView tv_ip;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_ip = findViewById(R.id.tv_ip);andServerManage = new AndServerManage(this);andServerManage.register();andServerManage.startServer();}@Overrideprotected void onDestroy() {super.onDestroy();andServerManage.unRegister();}public void onServerStart(String ip) {tv_ip.setText("onServerStart http://" + ip + ":8080/");}public void onServerError(String message) {tv_ip.setText("onServerError " + message);}public void onServerStop() {tv_ip.setText("onServerStop");}
}

6.controller 应该就叫接口了吧
就是注册接口,以及接到请求之后处理的类,具体我是不知道,我是问的好大哥。

@RestController
//@RequestMapping(path = "/wsy") 为请求路径 即完整路径为 ip:port/wsy/各个方法
@RequestMapping(path = "/wsy")
class TestController {@RequestMapping(path = "/connection",method = {RequestMethod.GET},produces = MediaType.APPLICATION_JSON_UTF8_VALUE)Object getConnection(HttpRequest request) {Map<String, Object> map = new HashMap<>();map.put("getLocalAddr", request.getLocalAddr());map.put("getLocalName", request.getLocalName());map.put("getLocalPort", request.getLocalPort());map.put("getRemoteAddr", request.getRemoteAddr());map.put("getRemoteHost", request.getRemoteHost());map.put("getRemotePort", request.getRemotePort());Log.e("wsy", new Gson().toJson(map));return map;}@CrossOrigin(methods = {RequestMethod.POST, RequestMethod.GET})//上面的 是人家的 好大哥说有点作用我就没删 但是删掉应该没有大病//这下面是我研究写的 简单的接口 接俩个参数 加法 之后返回 //get接口 path = “/gettest”为请求路径//@RequestParam("num1")int num1 为声明接收参数@GetMapping(path = "/gettest", consumes = {"application/json", "!application/xml"})String gettest(@RequestParam("num1")int num1,@RequestParam("num2")int num2) {return "successful " + (num1 + num2);}//post接口@PostMapping(path = "/posttest", consumes = {"application/json", "!application/xml"})String posttest(@RequestParam("num1")int num1,@RequestParam("num2")int num2) {return "successful " + (num1 + num2);}
}

7.然后就是测试
运行真机 知道自己的 ip地址

然后用postman测试一手,看看效果

效果出来了,完事,这就满足我目前的需求了,剩下的之后在研究。

AndServer浅显使用相关推荐

  1. 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作者:涂根华 来源:www.cnblogs.com/tugenhua0707 Git使 ...

  2. 面试题:SSH 和 SSM 两个框架的浅显的区别?

    概述 本人使用过SSH框架一段时间,最后在优化项目的时候决定使用SSM框架,这两种框架的一些浅显的区别我在这里说下. SSH框架是Struts+Spring+Hibernate而SSM是指的Sprin ...

  3. 对凸优化(Convex Optimization)的一些浅显理解

    ©作者 | 李航前 单位 | EPFL 研究方向 | 计算机图形学与三维视觉 最近学习了一些凸优化课程,整理笔记的同时写下一些自己的理解,向着头秃的道路上越走越远. 凸优化是应用数学的一个基本分支,几 ...

  4. Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

    转载自   Git使用教程:最详细.最傻瓜.最浅显.真正手把手教 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace:工作区 Index / ...

  5. Git使用教程:最详细、最浅显、一文读懂Git常用操作!

    作者:涂根华 来源:www.cnblogs.com/tugenhua0707 转自:datawhale Git使用教程: 最详细.最傻瓜.最浅显.真正手把手教! 导读:因为教程详细,所以行文有些长,新 ...

  6. GoLang之map底层系列二(浅显学习)

    文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...

  7. RNN、self-attention、transform的浅显或许错误的理解

    RNN.self-attention.transform的浅显或许错误的理解 一.RNN的理解 二.self-attention的理解 三.Transform的理解 四.结语 所有的理解都是基于我匮乏 ...

  8. 用AndServer做安卓手机服务器

    用AndServer搭建手机服务器以及跨域问题解决 AndServer官方文档地址 AndServer简介 什么情况需要用? AndServer官方文档地址 https://yanzhenjie.co ...

  9. 【转】最浅显的LDAP介绍

    这是我看到的最浅显的一篇LDAP入门介绍,特意转载过来.原文链接 首先要先理解什么是LDAP,当时我看了很多解释,也是云里雾里,弄不清楚.在这里给大家稍微捋一捋. 首先LDAP是一种通讯协议,LDAP ...

最新文章

  1. 最适合你性格的职业类型是什么?
  2. 协议学习:TCP/IP协议之物理层 上
  3. FIREBIRD浅历
  4. 【问题收集·中级】关于XMPP使用Base传送图片
  5. Moocryption
  6. Qt for ios 打开图片和 office文件
  7. 33、JAVA_WEB开发基础之会话机制
  8. ActiveMQ 即时通讯服务 入門指南及淺析
  9. 你爱我,我爱你,IP被封很头疼【Python爬虫实战:ip代理js逆向采集】
  10. 【iCore4 双核心板_ARM】例程二十九:SD_IAP_FPGA实验——更新升级FPGA
  11. 公司绝不会告诉你的20大秘密 转载
  12. 各种未授权访问漏洞的复现与利用
  13. MV* 模式梳理与理解(还原真实的 MV* 模式)
  14. python兔子繁殖问题_【算法】兔子繁殖之斐波那契数列
  15. 如何更好地理解中间件和洋葱模型
  16. 一说出口就被误解的离职原因,这样补救!
  17. Redis缓存——(分布式锁)
  18. 南邮——计算机图像学——光照、冯氏光照模型
  19. 人脑与计算机类比文献,浅析电脑与人脑的关系.docx
  20. springboot和springcloud功能详细介绍

热门文章

  1. 小步快跑是这样玩的(上)
  2. Android - ProGuard简介
  3. Ubuntu 18.04 run方式安装Cuda9.0 惠普Z6工作站
  4. 小白终是踏上了这条不归路----小文的mysql学习笔记目录
  5. 前端逼死强迫症系列之css
  6. html 、css基础
  7. nfc android 7.0 apk,分屏/NFC一卡通 一加3安卓7.0氢OS体验
  8. 关于Debian10的网络配置
  9. php联图生成二维码浏览器扫可以到页面,但是QQ或微信扫直接显示链接
  10. 习惯养成微信小程序的设计与实现