Android设备搭建http服务器AndServer

Posted zhangphil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android设备搭建http服务器AndServer相关的知识,希望对你有一定的参考价值。

android设备搭建http服务器AndServer

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

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

buildscript 
    repositories 
        mavenCentral()
    

    dependencies 
        classpath 'com.yanzhenjie.andserver:plugin:2.1.10'
    

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

然后plugins变成

plugins 
    id 'com.android.application'
    id 'com.yanzhenjie.andserver'

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

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

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

package zhangphil.httpserver;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.yanzhenjie.andserver.AndServer;
import com.yanzhenjie.andserver.Server;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity 
    private Server mServer;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        mServer = AndServer.webServer(this)
                .port(9999)
                .timeout(10, TimeUnit.SECONDS).listener(new Server.ServerListener() 
                    @Override
                    public void onStarted() 
                        System.out.println("服务器绑定地址:"+NetUtils.getLocalIPAddress().getHostAddress());
                    

                    @Override
                    public void onStopped() 

                    

                    @Override
                    public void onException(Exception e) 

                    
                )
                .build();

        mServer.startup();
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        mServer.shutdown();
    

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

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

package zhangphil.httpserver;

import com.yanzhenjie.andserver.annotation.GetMapping;
import com.yanzhenjie.andserver.annotation.PathVariable;
import com.yanzhenjie.andserver.annotation.PostMapping;
import com.yanzhenjie.andserver.annotation.QueryParam;
import com.yanzhenjie.andserver.annotation.RequestBody;
import com.yanzhenjie.andserver.annotation.RequestParam;
import com.yanzhenjie.andserver.annotation.RestController;

import org.json.JSONObject;


@RestController
public class ServerController 
    @GetMapping("/")
    public String ping() 
        return "SERVER OK";
    

    @PostMapping("/user/login")
    public JSONObject login(@RequestBody String str) throws Exception 
        JSONObject jsonObject = new JSONObject(str);
        return jsonObject;
    

    @GetMapping("/user/item")
    public JSONObject requestItem(@RequestParam("name") String name,
                                 @RequestParam("id") String id) throws Exception 
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", name);
        jsonObject.put("id", id);

        return jsonObject;
    

    @GetMapping("/user/userId")
    public JSONObject getUser(@PathVariable("userId") String userId,
                           @QueryParam("key") String key) throws Exception
        JSONObject user = new JSONObject();
        user.put("id", userId);
        user.put("key", key);
        user.put("year", 2022);

        return user;
    

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

package zhangphil.httpserver;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Pattern;

public class NetUtils 
    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])$");

    public static boolean isIPv4Address(String input) 
        return IPV4_PATTERN.matcher(input).matches();
    

    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;
    

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

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

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

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

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

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

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

以上是关于Android设备搭建http服务器AndServer的主要内容,如果未能解决你的问题,请参考以下文章

Mosquitto搭建Android推送服务Mosquitto简介及搭建

Mosquitto搭建Android推送服务Mosquitto简介及搭建

Android XMPP服务器, BOSH(Http-Binding)和WEB客户端搭建

无法通过 Android 设备中的 Worklight http 适配器连接到后端

使用 REST 处理 HTTP Get/Delete Android

如何使用异步http post从android studio发送数据到xampp并在真实设备中运行?