AndServer浅显使用
刚刚接触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浅显使用相关推荐
- 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作者:涂根华 来源:www.cnblogs.com/tugenhua0707 Git使 ...
- 面试题:SSH 和 SSM 两个框架的浅显的区别?
概述 本人使用过SSH框架一段时间,最后在优化项目的时候决定使用SSM框架,这两种框架的一些浅显的区别我在这里说下. SSH框架是Struts+Spring+Hibernate而SSM是指的Sprin ...
- 对凸优化(Convex Optimization)的一些浅显理解
©作者 | 李航前 单位 | EPFL 研究方向 | 计算机图形学与三维视觉 最近学习了一些凸优化课程,整理笔记的同时写下一些自己的理解,向着头秃的道路上越走越远. 凸优化是应用数学的一个基本分支,几 ...
- Git使用教程:最详细、最傻瓜、最浅显、真正手把手教
转载自 Git使用教程:最详细.最傻瓜.最浅显.真正手把手教 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace:工作区 Index / ...
- Git使用教程:最详细、最浅显、一文读懂Git常用操作!
作者:涂根华 来源:www.cnblogs.com/tugenhua0707 转自:datawhale Git使用教程: 最详细.最傻瓜.最浅显.真正手把手教! 导读:因为教程详细,所以行文有些长,新 ...
- GoLang之map底层系列二(浅显学习)
文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...
- RNN、self-attention、transform的浅显或许错误的理解
RNN.self-attention.transform的浅显或许错误的理解 一.RNN的理解 二.self-attention的理解 三.Transform的理解 四.结语 所有的理解都是基于我匮乏 ...
- 用AndServer做安卓手机服务器
用AndServer搭建手机服务器以及跨域问题解决 AndServer官方文档地址 AndServer简介 什么情况需要用? AndServer官方文档地址 https://yanzhenjie.co ...
- 【转】最浅显的LDAP介绍
这是我看到的最浅显的一篇LDAP入门介绍,特意转载过来.原文链接 首先要先理解什么是LDAP,当时我看了很多解释,也是云里雾里,弄不清楚.在这里给大家稍微捋一捋. 首先LDAP是一种通讯协议,LDAP ...
最新文章
- 最适合你性格的职业类型是什么?
- 协议学习:TCP/IP协议之物理层 上
- FIREBIRD浅历
- 【问题收集·中级】关于XMPP使用Base传送图片
- Moocryption
- Qt for ios 打开图片和 office文件
- 33、JAVA_WEB开发基础之会话机制
- ActiveMQ 即时通讯服务 入門指南及淺析
- 你爱我,我爱你,IP被封很头疼【Python爬虫实战:ip代理js逆向采集】
- 【iCore4 双核心板_ARM】例程二十九:SD_IAP_FPGA实验——更新升级FPGA
- 公司绝不会告诉你的20大秘密 转载
- 各种未授权访问漏洞的复现与利用
- MV* 模式梳理与理解(还原真实的 MV* 模式)
- python兔子繁殖问题_【算法】兔子繁殖之斐波那契数列
- 如何更好地理解中间件和洋葱模型
- 一说出口就被误解的离职原因,这样补救!
- Redis缓存——(分布式锁)
- 南邮——计算机图像学——光照、冯氏光照模型
- 人脑与计算机类比文献,浅析电脑与人脑的关系.docx
- springboot和springcloud功能详细介绍