AndServer

AndServer 类似于 Apache 和 Tomcat,支持在同个局域网下的设备能够以常规的网络请求方式来向 Web 服务器请求数据,只要指明 Web 服务器的 IP 地址和端口号即可

使用

添加依赖

implementation 'com.yanzhenjie:andserver:1.1.3'

CoreService类
注意在注册时.registerHandler()中字符要与html文件中的action一致
NetUtils类文末提供

*** 本地局域网启动Service*/public class CoreService extends Service {private Server mServer;@Overridepublic void onCreate() {AssetManager mAssetManager = getAssets();/*** rootPath 表示在assets资源文件中的位置,根目录为空即可* 有目录传入 "目录" 即可*/AssetsWebsite wesite = new AssetsWebsite(mAssetManager, "");mServer = AndServer.serverBuilder().port(8080) //服务器要监听的端口.timeout(30000, TimeUnit.SECONDS) //Socket超时时间.website(wesite)        //设置路径.registerHandler("/json", new JsonHandler()) //注册一个Post Json接口  /json对应html form标签中的action.filter(new HttpCacheFilter()) //开启缓存支持.listener(new Server.ServerListener() {  //服务器监听接口@Overridepublic void onStarted() {//获取本地地址供外部访问InetAddress address = NetUtils.getLocalIPAddress();ServerManager.onServerStart(CoreService.this, address.getHostAddress());}@Overridepublic void onStopped() {}@Overridepublic void onError(Exception e) {ServerManager.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;}
}

JsonHandler类
日志与设置类就不提供了,这里自己处理返回的数据即可;
转义的工具类文末提供

/*** post表单处理*/
public class JsonHandler implements RequestHandler {@RequestMapping(method = {RequestMethod.POST})@Overridepublic void handle(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {String content = HttpRequestParser.getContentFromBody(httpRequest);//解析网址(还原转义字符)String ServiceUrl = UrlDeal.decodeURIComponent(content).substring(UrlDeal.decodeURIComponent(content).indexOf("=")+1);//保存日志LogUtil.info("Time:"+System.currentTimeMillis()+"IPAddress"+ServiceUrl+"  Modify server address");//保存解析后的网址ConfigOperate.getInstance(null).setHost_url(ServiceUrl);JSONObject jsonObject = null;try {jsonObject = new JSONObject(content);//进行} catch (JSONException e) {e.printStackTrace();}if (jsonObject == null) {jsonObject = new JSONObject();}try {//向web返回数据 中文乱码jsonObject.put("state", "Server address modified successfully");} catch (JSONException e) {e.printStackTrace();}StringEntity stringEntity = new StringEntity(jsonObject.toString(), "utf-8");httpResponse.setStatusCode(200);httpResponse.setEntity(stringEntity);}}

index.html
这个文件直接放在assets资源文件夹下即可

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8" /><title>修改地址</title><style>.search{width: 681px;height: 43px;margin: 0px auto;margin-top:20%;}.search input#ip{height: 43px;line-height: 43px;width: 550px;font-size: 16px;padding: 0px 15px;border: 1px #b6b6b6 solid;border-radius: 10px 0 0 10px;border-right: 0px;float: left;}.search input#submit{float: left;width: 100px;text-align: center;background: #4e6ef2;border: 1px solid #4e6ef2;border-radius: 0 10px 10px 0;height: 45px;font-size: 18px;color: #fff;font-weight: bold;}</style>
</head>
<body>
<div class="search"><form id="form1" action="/json" method="post"><input type="text" name="ip" id="ip" value="" placeholder="请输入服务器地址"/><input type="submit" id="submit" value="确定" /></form></div>
</body>
</html>

UrlDeal类

import java.io.UnsupportedEncodingException;/*** 实现JS中的encodeURIComponent 、 decodeURIComponent 方法* 转义字符串、解析字符串*/public class UrlDeal {public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";public static String encodeURIComponent(String input) {if (input == null || "".equals(input)) {return input;}int l = input.length();StringBuilder o = new StringBuilder(l * 3);try {for (int i = 0; i < l; i++) {String e = input.substring(i, i + 1);if (ALLOWED_CHARS.indexOf(e) == -1) {byte[] b = e.getBytes("utf-8");o.append(getHex(b));continue;}o.append(e);}return o.toString();} catch (UnsupportedEncodingException e) {e.printStackTrace();}return input;}private static String getHex(byte buf[]) {StringBuilder o = new StringBuilder(buf.length * 3);for (int i = 0; i < buf.length; i++) {int n = (int) buf[i] & 0xff;o.append("%");if (n < 0x10) {o.append("0");}o.append(Long.toString(n, 16).toUpperCase());}return o.toString();}public static String decodeURIComponent(String encodedURI) {char actualChar;StringBuffer buffer = new StringBuffer();int bytePattern, sumb = 0;for (int i = 0, more = -1; i < encodedURI.length(); i++) {actualChar = encodedURI.charAt(i);switch (actualChar) {case '%': {actualChar = encodedURI.charAt(++i);int hb = (Character.isDigit(actualChar) ? actualChar - '0': 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;actualChar = encodedURI.charAt(++i);int lb = (Character.isDigit(actualChar) ? actualChar - '0': 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;bytePattern = (hb << 4) | lb;break;}case '+': {bytePattern = ' ';break;}default: {bytePattern = actualChar;}}if ((bytePattern & 0xc0) == 0x80) { // 10xxxxxxsumb = (sumb << 6) | (bytePattern & 0x3f);if (--more == 0)buffer.append((char) sumb);} else if ((bytePattern & 0x80) == 0x00) { // 0xxxxxxxbuffer.append((char) bytePattern);} else if ((bytePattern & 0xe0) == 0xc0) { // 110xxxxxsumb = bytePattern & 0x1f;more = 1;} else if ((bytePattern & 0xf0) == 0xe0) { // 1110xxxxsumb = bytePattern & 0x0f;more = 2;} else if ((bytePattern & 0xf8) == 0xf0) { // 11110xxxsumb = bytePattern & 0x07;more = 3;} else if ((bytePattern & 0xfc) == 0xf8) { // 111110xxsumb = bytePattern & 0x03;more = 4;} else { // 1111110xsumb = bytePattern & 0x01;more = 5;}}return buffer.toString();}
}

NetUtils类

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Pattern;/*** 网络工具类*/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;}
}

直接在需要使用的地方启动CoreService即可开启服务
局域网地址示例 http://10.0.0.1:8080/index.html
具体ip地址打日志或者debug看吧

github地址: Anderver

Android 搭建局域网服务器相关推荐

  1. java http 服务器搭建_基于http.server搭建局域网服务器过程解析

    不知道大家有没有遇到过这样的情况, 在做项目或者研发的时候,迫切想要将一个文件传输给另一台电脑,却找不到u盘,于是麻烦的通过登陆qq.微信等社交软件 ,或者邮箱等工具进行传输,十分麻烦,让人苦恼.都说 ...

  2. Android 搭建Linux服务器

    前言 最近给家人换了一台新手机,而旧手机难道就低价回收了吗?作为曾经的一名安卓工程师,这些旧手机对我都有一定的价值.于是我把手机刷机,想看看还能干啥用,突然想到安卓底层是Linux内核呀,应该可以在其 ...

  3. git搭建局域网服务器

    安装git: sudo apt-get update sudo apt-get install git-core openssh-server 增加 developers 组以及创建保存项目的仓库: ...

  4. Android搭建ftp服务器/客户端

    jar包链接https://download.csdn.net/download/weixin_40391500/10629775 ftp服务器 不设置读写权限是不能上传的文件的 private st ...

  5. 安卓搭建局域网服务器KSWEB--序列号

    1.准备工具: 安卓手机 笔记本电脑 ksweb3.62--输入任意序列号即可(仅限此版本)155B-38B1-0EC7-2E29 网络 2.安装ksweb3.62 3.破解方法: 一定要有网络:完成 ...

  6. android 搭建FTP服务器

    1下载jar包 http://mina.apache.org/ftpserver-project/download_1.1.1.html 将jar包文件拷贝到libs目录下如下图所示 在build.g ...

  7. python 服务器_只要一行Python代码,就能搭建一个共享文件局域网服务器

    不知道大家有没有遇到过这样的情况,在做项目或者研发的时候,迫切想要将一个文件传输给另一台电脑,却找不到U盘,于是麻烦的通过登陆qq.微信等社交软件,或者邮箱等工具进行传输,十分麻烦,让人苦恼. 都说P ...

  8. python实现局域网攻击_牛逼了!一行Python代码搭建一个局域网服务器

    不知道大家有没有遇到过这样的情况, 在做项目或者研发的时候,迫切想要将一个文件传输给另一台电脑,却找不到U盘,于是麻烦的通过登陆qq.微信等社交软件 ,或者邮箱等工具进行传输,十分麻烦,让人苦恼. 都 ...

  9. python 共享文件_只要一行Python代码,就能搭建一个共享文件局域网服务器

    不知道大家有没有遇到过这样的情况,在做项目或者研发的时候,迫切想要将一个文件传输给另一台电脑,却找不到U盘,于是麻烦的通过登陆qq.微信等社交软件,或者邮箱等工具进行传输,十分麻烦,让人苦恼. 都说P ...

最新文章

  1. java影像出租面向对象,Java中的面向对象 - zhiruochujian的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 开源 免费 java CMS - FreeCMS1.2-标签 mailList
  3. HDU4694 Important Sisters
  4. Divide and conquer:K Best(POJ 3111)
  5. jquery-validae
  6. boost::hana::curry用法的测试程序
  7. Jon Wexler and adidas NMD R1 Primeknit Zebra Pack
  8. Linux16.04下配置Caffe,Pycaffe,matcaffe
  9. Android Studio3.0简介
  10. linux系统增加内存无法启动,linux – 增加虚拟内存而不增加VmSize
  11. python中的main函数可以被其他文件调用么_Python中在脚本中引用其他文件函数的实现方法...
  12. vue 前端png转pdf_Vue前端HTML保存为PDF的两种常用方式 「干货分享」
  13. opendir是安全重入函数吗_redis实现分布式锁,与jdk可重入锁ReentrantLock的原理对比剖析...
  14. 计算机中rom和ram分别指什么,RAM和ROM分别是什么意思
  15. 当你感觉为时已晚的时候,恰恰是最早的时候。
  16. 风险偏好提振,非美延续反弹
  17. 真正的小说 真正的生活 真正的蜕变 真正的品味
  18. Mac出现共享网络/wifi问题
  19. 光功率 博科交换机_交换机光功率
  20. 简单的node文件上传下载及中文乱码问题解决

热门文章

  1. 电商数据仓库项目总结
  2. 蓝桥杯练习系统-基础练习
  3. 深度学习——NLP中词的表示方法word embeddingword2vec
  4. c语言无符号字符型5是什么,C语言中无符号型别是什么意思啊?
  5. android手机功能创新,Android手机QQ浏览器1.1发布多项创新功能
  6. 真正的自由是节制欲望自律简朴地去生活
  7. 移动硬盘-移动硬盘提示格式化的解决办法
  8. 12弦原声大吉他音源 Orange Tree Samples Evolution Jumbo 12 Kontakt
  9. 认为的文字可编辑的 pdf和图片展示的 pdf 做笔记的方式
  10. C语言之复合类型下卷(十九)(自然法则)(2023)