【NanoHTTPD】Android,使用NanoHTTPD搭建服务器,接受Http请求,最佳实践

这篇具有很好参考价值的文章主要介绍了【NanoHTTPD】Android,使用NanoHTTPD搭建服务器,接受Http请求,最佳实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android,NanoHTTPD搭建服务器,接受Http请求最佳实践

1,了解

安卓app,作为服务器,接受Http,get post 请求推送数据,NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。

开源地址:GitHub - NanoHttpd/nanohttpd: Tiny, easily embeddable HTTP server in Java.

2,引入依赖

implementation 'org.nanohttpd:nanohttpd:2.3.1'

3,开始集成

这里需要注意以下三点问题:

  • 系统端口:0~1023,用于运行标准服务,例如 HTTP 服务(端口 80)、FTP 服务(端口 21)等。
    注册端口:1024~49151,用于运行注册的应用程序或服务,例如 DNS 服务(端口 53)、SMTP 服务(端口 25)等。
    动态/私有端口:49152~65535,可以被动态分配给任何应用程序或服务,通常用于客户端。 所以,如下代码,我们声明监听的端口是 49152 ,避免端口被占用
  • 请求携带中文,需要将请求头设置 UTF-8 字符集,防止中文乱码,如下代码27行进行相关处理;
  • 客户端发送POST请求,获取 POSTBody参数,需要 session.parseBody(new HashMap<String,String>()),如下代码40行处理,获取Body参数。

3.1 自定义类,继承 NanoHTTPD

public class MyNanoHttpdServer extends NanoHTTPD  {
	
    //声明服务端 端口
    private static final Integer HTTP_PORT = 49152;

    public MyNanoHttpdServer(String hostname, int port) {
        super(hostname, port);
    }

    private volatile static MyNanoHttpdServer myNanoHttpdServer;

 	//TODO	单例模式,获取实例对象,并传入当前机器IP
    public static MyNanoHttpdServer getInstance(String ipAddress) {
        if (myNanoHttpdServer == null) {
            synchronized (MyNanoHttpdServer.class) {
                if (myNanoHttpdServer == null) {
                    myNanoHttpdServer = new MyNanoHttpdServer(ipAddress, HTTP_PORT);
                }
            }
        }
        return myNanoHttpdServer;
    }

    @Override
    public Response serve(IHTTPSession session) {
        //TODO  解决客户端请求参数携带中文,出现中文乱码问题
        ContentType ct = new ContentType(session.getHeaders().get("content-type")).tryUTF8();
        session.getHeaders().put("content-type", ct.getContentTypeHeader());
        return dealWith(session);
    }

    private Response dealWith(IHTTPSession  session) {
        Date dateTime = new Date();
        if (Method.POST == session.getMethod()) {
            //获取请求头数据
            Map<String,String> header = session.getHeaders();
            //获取传参参数
            Map<String, String> params = new HashMap<String, String>();
            try {
                session.parseBody(params);
                String paramStr = params.get("postData");
                if(StringUtils.isEmpty(paramStr)){
                    return newFixedLengthResponse("success");
                }
                paramStr = paramStr.replace("\r\n"," ");

                JSONObject jsonParam = JSON.parseObject(paramStr);
                Map<String,Object> result = new HashMap<>();
				//TODO 写你的业务逻辑.....
                
                 //响应客户端
                 return   newFixedLengthResponse("success");
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ResponseException e) {
                e.printStackTrace();
            }
            return   newFixedLengthResponse("success");
        }else if (Method.GET == session.getMethod()){

            Map<String, List<String>> parameters = session.getParameters();
            return   newFixedLengthResponse("success");
        }

        return newFixedLengthResponse("404");
    }

    public static Response newFixedLengthResponse(String msg) {
        return newFixedLengthResponse(Response.Status.OK, NanoHTTPD.MIME_HTML, msg);
    }

}

3.2 在 AndroidMainifest.xml,开启网络权限,注册服务,后台运行

<!--开启网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<application>
     <!--注册服务>
     <service android:name=".nanoHttpd.MyNanoHttpService" />
</application>

自定义服务类,继承 Service

public class MyNanoHttpService extends Service {

    private MyNanoHttpdServer httpServer = MyNanoHttpdServer.getInstance(null);

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            httpServer.start();
        } catch (Exception e) {
            e.printStackTrace();
            startService(new Intent(this,MyNanoHttpService.class));
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){

        return super.onStartCommand(intent, flags, startId);
    }

    public void onDestroy() {
        httpServer.stop();
    }
}

MainActivity 启动服务文章来源地址https://www.toymoban.com/news/detail-494900.html

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		 //实例化 获取ip 地址
         MyNanoHttpdServer.getInstance(getIPAddress());
        //启动服务监听
        startService(new Intent(this, MyNanoHttpService.class));
    }

     /**
     * 获得IP地址,分为两种情况:
     * 一:是wifi下;
     * 二:是移动网络下;
     */
    public  String getIPAddress() {
        Context context = WelcomeActivity.this;
        NetworkInfo info = ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
                try {
                    //Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //调用方法将int转换为地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else {
            //当前无网络连接,请在设置中打开网络
        }
        return null;
    }

    /**
     * 将得到的int类型的IP转换为String类型
     * @param ip
     * @return
     */
    public static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }
}

4,总结

  • 如果想要APP保持服务持久可用,又不被系统限制网络,,可以进入系统设置中设置“电池不优化”。
  • 根据之前的并发请求测试发现,只会返回同一条数据,而不是分别响应每一个接口请求。
    目前尚未找到适合的处理方式,暂且只能控制请求端的请求频次。
  • 如果并发请求大,请不要使用NanoHTTPD,还是通过JAVA和Spring 来做服务。

到了这里,关于【NanoHTTPD】Android,使用NanoHTTPD搭建服务器,接受Http请求,最佳实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器

    #!/bin/sh HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7 OpenSSL_PATH=…/openssl-1.1.1d #–prefix=./bin 代表编译完成之后输出的路径地址 #–add-module 将拓展模块添加到当前一起编译 ./configure --prefix=./bin –add-module= H T T P F L V M O D U L E P A T H   − − w i t h − o p e n s s l = HTTP_FLV_MODULE_PATH --with

    2024年04月15日
    浏览(61)
  • 使用Python搭建代理服务器- 爬虫代理服务器详细指南

    搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP。下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器: 1. 首先,确保你已经安装了Python。你可以在官方网站(https://www.python.org/)下载并安装最新版本的Python。 2. 安装所需的Python库。打开终端或

    2024年02月15日
    浏览(40)
  • TFTP服务器搭建与使用

    TFTP(Trivial File Transfer Protocol)也就是简单文件传输协议,常用于无盘工作站等从别的主机获取引导配置文件,由于TFTP报文较小,所以可以迅速复制这些文件。 TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服

    2024年02月16日
    浏览(33)
  • 【服务器】安卓手机使用Termux搭建web服务

      Yan-英杰的主页 悟已往之不谏 知来者之可追    C++程序员,2024届电子信息研究生 目录 概述 1.搭建apache 2.安装cpolar内网穿透 3.公网访问配置 4.固定公网地址 5.添加站点 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许

    2024年02月06日
    浏览(69)
  • 搭建Git本地服务器及其使用

    GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。 搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过

    2024年02月13日
    浏览(44)
  • 使用IIS服务器搭建一个网站

    IIS全称为Internet Information Services,是一种Web服务组件。通过在自己电脑上安装好IIS服务,就可以把你自己的电脑当作一个网站的服务器。 Step1、 控制面板——程序——程序和功能——启用或关闭windows功能 Step2、 重启一下电脑,在开始菜单栏里面找到IIS服务 Step3、 进入IIS管理

    2024年02月05日
    浏览(55)
  • 使用docker搭建kms服务器

    仅个人工作时对操作步骤进行记录,无任何安全、可行性保证,转载请标注出处! 配置IP地址,使其可正常上网。 2.配置yum源 #安装yum工具 yum -y install yum-utils #下载配置阿里的yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo #下载配置docker的

    2024年02月04日
    浏览(42)
  • 使用 Nginx 搭建文件下载服务器

      版权声明:本文为CSDN博主「杨群」的原创文章,遵循 CC 4.0 BY-SA版权协议,于2023年8月27日首发于CSDN,转载请附上原文出处链接及本声明。   原文链接:https://blog.csdn.net/u011046671/article/details/132526618   操作系统:microsoft Windows 10 专业版   nginx 版本:1.25.1   使用

    2024年02月06日
    浏览(53)
  • nfs服务器的描述,搭建和使用

    前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:RodmaChen NFS概述 NFS(Network File System)是一种基于网络的文件系统协议,它允许不同的计算机系统通过网络共享文件和目录。本文将介绍NFS的工作原理、优缺点以及挂载后客户端创建文件服务端也会出

    2024年02月15日
    浏览(56)
  • 使用node简单搭建websocket服务器

    我们都知道,http协议通信只能由客户端发起,然后服务端再做出响应;但是websocket协议最大的特点是服务端可以主动向客户端推送消息,客户端也可以主动向服务器发送消息 往常实现双向通信的方法主要是 轮询, 客户端通过定时器,每隔一段时间就会主动发送请求给服务器

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包