• Android设备搭建http服务器AndServer


    Android设备搭建http服务器AndServer

    (1)需要在项目中引用AndServer,但是这里面有一些问题,主要是因为新版Android studio中的高版本gradle改变了添加plug和引用的方式。

    在项目的根build.gradle文件(不是app那个moudle的build.gradle)最顶部添加:

    1. buildscript {
    2. repositories {
    3. mavenCentral()
    4. }
    5. dependencies {
    6. classpath 'com.yanzhenjie.andserver:plugin:2.1.10'
    7. }
    8. }

    (2)然后在当前的moudle(一般就是app)的build.gradle里面的plugins里面添加:id 'com.yanzhenjie.andserver'

    然后plugins变成

    1. plugins {
    2. id 'com.android.application'
    3. id 'com.yanzhenjie.andserver'
    4. }

    接着在当前的这个build.gradle里面dependencies的添加:

    1. implementation 'com.yanzhenjie.andserver:api:2.1.10'
    2. annotationProcessor 'com.yanzhenjie.andserver:processor:2.1.10'

    (3)开始写上层Java代码:

    1. package zhangphil.httpserver;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import com.yanzhenjie.andserver.AndServer;
    5. import com.yanzhenjie.andserver.Server;
    6. import java.util.concurrent.TimeUnit;
    7. public class MainActivity extends AppCompatActivity {
    8. private Server mServer;
    9. @Override
    10. protected void onCreate(Bundle savedInstanceState) {
    11. super.onCreate(savedInstanceState);
    12. mServer = AndServer.webServer(this)
    13. .port(9999)
    14. .timeout(10, TimeUnit.SECONDS).listener(new Server.ServerListener() {
    15. @Override
    16. public void onStarted() {
    17. System.out.println("服务器绑定地址:"+NetUtils.getLocalIPAddress().getHostAddress());
    18. }
    19. @Override
    20. public void onStopped() {
    21. }
    22. @Override
    23. public void onException(Exception e) {
    24. }
    25. })
    26. .build();
    27. mServer.startup();
    28. }
    29. @Override
    30. protected void onDestroy() {
    31. super.onDestroy();
    32. mServer.shutdown();
    33. }
    34. }

    上面代码主要是启动在Android手机(设备)上的http服务器,服务器绑定端口9999,绑定成功后打印IP地址。

    下面是spring样式的restful代码实现,核心关键,http访问接口实现:

    1. package zhangphil.httpserver;
    2. import com.yanzhenjie.andserver.annotation.GetMapping;
    3. import com.yanzhenjie.andserver.annotation.PathVariable;
    4. import com.yanzhenjie.andserver.annotation.PostMapping;
    5. import com.yanzhenjie.andserver.annotation.QueryParam;
    6. import com.yanzhenjie.andserver.annotation.RequestBody;
    7. import com.yanzhenjie.andserver.annotation.RequestParam;
    8. import com.yanzhenjie.andserver.annotation.RestController;
    9. import org.json.JSONObject;
    10. @RestController
    11. public class ServerController {
    12. @GetMapping("/")
    13. public String ping() {
    14. return "SERVER OK";
    15. }
    16. @PostMapping("/user/login")
    17. public JSONObject login(@RequestBody String str) throws Exception {
    18. JSONObject jsonObject = new JSONObject(str);
    19. return jsonObject;
    20. }
    21. @GetMapping("/user/item")
    22. public JSONObject requestItem(@RequestParam("name") String name,
    23. @RequestParam("id") String id) throws Exception {
    24. JSONObject jsonObject = new JSONObject();
    25. jsonObject.put("name", name);
    26. jsonObject.put("id", id);
    27. return jsonObject;
    28. }
    29. @GetMapping("/user/{userId}")
    30. public JSONObject getUser(@PathVariable("userId") String userId,
    31. @QueryParam("key") String key) throws Exception{
    32. JSONObject user = new JSONObject();
    33. user.put("id", userId);
    34. user.put("key", key);
    35. user.put("year", 2022);
    36. return user;
    37. }
    38. }

    NetUtils.java主要是为了获取当前Android手机的IP地址:

    1. package zhangphil.httpserver;
    2. import java.net.InetAddress;
    3. import java.net.NetworkInterface;
    4. import java.net.SocketException;
    5. import java.util.Enumeration;
    6. import java.util.regex.Pattern;
    7. public class NetUtils {
    8. private static final Pattern IPV4_PATTERN = Pattern.compile(
    9. "^(" + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
    10. "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
    11. public static boolean isIPv4Address(String input) {
    12. return IPV4_PATTERN.matcher(input).matches();
    13. }
    14. public static InetAddress getLocalIPAddress() {
    15. Enumeration enumeration = null;
    16. try {
    17. enumeration = NetworkInterface.getNetworkInterfaces();
    18. } catch (SocketException e) {
    19. e.printStackTrace();
    20. }
    21. if (enumeration != null) {
    22. while (enumeration.hasMoreElements()) {
    23. NetworkInterface nif = enumeration.nextElement();
    24. Enumeration inetAddresses = nif.getInetAddresses();
    25. if (inetAddresses != null) {
    26. while (inetAddresses.hasMoreElements()) {
    27. InetAddress inetAddress = inetAddresses.nextElement();
    28. if (!inetAddress.isLoopbackAddress() && isIPv4Address(inetAddress.getHostAddress())) {
    29. return inetAddress;
    30. }
    31. }
    32. }
    33. }
    34. }
    35. return null;
    36. }
    37. }

    以上代码写好后,注意在AndroidManifest.xml配置网络权限:

    1. <uses-permission android:name="android.permission.INTERNET"/>
    2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    接下来,就可以通过浏览器或者postman访问Android手机上运行的服务器了。

    在浏览器里面测试服务器的连通性,ping()接口:

    用户的登陆接口user/login,login()接口:

    支持连接符号&的requestItem接口:

    具备查询功能的getUser()接口:

  • 相关阅读:
    Java基础项目~用户管理系统
    【附源码】计算机毕业设计JAVA学校食堂订餐管理
    【高频Java面试题】简单说说JVM堆的内存结构和GC回收流程
    【Flink入门修炼】1-3 Flink WordCount 入门实现
    【英语:基础高阶_经典外刊阅读】L2.阅读理解必备技能—词义推测
    护眼台灯该怎么样选择?2022如何选择一款好的护眼台灯
    X-former系列(Transformer大家族)
    JsonFormat格式化两位小数
    Linux安装tomcat9
    ACTF flutter逆向学习
  • 原文地址:https://blog.csdn.net/zhangphil/article/details/126629321