国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【NanoHTTPD】Android,使用NanoHTTPD搭建服務器,接受Http請求,最佳實踐

這篇具有很好參考價值的文章主要介紹了【NanoHTTPD】Android,使用NanoHTTPD搭建服務器,接受Http請求,最佳實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android,NanoHTTPD搭建服務器,接受Http請求最佳實踐

1,了解

安卓app,作為服務器,接受Http,get post 請求推送數(shù)據(jù),NanoHTTPD是一個免費、輕量級的(只有一個Java文件) HTTP服務器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 請求,支持文件上傳,占用內(nèi)存很小。

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

2,引入依賴

implementation 'org.nanohttpd:nanohttpd:2.3.1'

3,開始集成

這里需要注意以下三點問題:

  • 系統(tǒng)端口:0~1023,用于運行標準服務,例如 HTTP 服務(端口 80)、FTP 服務(端口 21)等。
    注冊端口:1024~49151,用于運行注冊的應用程序或服務,例如 DNS 服務(端口 53)、SMTP 服務(端口 25)等。
    動態(tài)/私有端口:49152~65535,可以被動態(tài)分配給任何應用程序或服務,通常用于客戶端。 所以,如下代碼,我們聲明監(jiān)聽的端口是 49152 ,避免端口被占用
  • 請求攜帶中文,需要將請求頭設置 UTF-8 字符集,防止中文亂碼,如下代碼27行進行相關(guān)處理;
  • 客戶端發(fā)送POST請求,獲取 POST,Body參數(shù),需要 session.parseBody(new HashMap<String,String>()),如下代碼40行處理,獲取Body參數(shù)。

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  解決客戶端請求參數(shù)攜帶中文,出現(xiàn)中文亂碼問題
        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()) {
            //獲取請求頭數(shù)據(jù)
            Map<String,String> header = session.getHeaders();
            //獲取傳參參數(shù)
            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 寫你的業(yè)務邏輯.....
                
                 //響應客戶端
                 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,開啟網(wǎng)絡權(quán)限,注冊服務,后臺運行

<!--開啟網(wǎng)絡權(quán)限-->
<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 啟動服務文章來源地址http://www.zghlxwxcb.cn/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());
        //啟動服務監(jiān)聽
        startService(new Intent(this, MyNanoHttpService.class));
    }

     /**
     * 獲得IP地址,分為兩種情況:
     * 一:是wifi下;
     * 二:是移動網(wǎng)絡下;
     */
    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網(wǎng)絡
                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) {//當前使用無線網(wǎng)絡
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //調(diào)用方法將int轉(zhuǎn)換為地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else {
            //當前無網(wǎng)絡連接,請在設置中打開網(wǎng)絡
        }
        return null;
    }

    /**
     * 將得到的int類型的IP轉(zhuǎn)換為String類型
     * @param ip
     * @return
     */
    public static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }
}

4,總結(jié)

  • 如果想要APP保持服務持久可用,又不被系統(tǒng)限制網(wǎng)絡,,可以進入系統(tǒng)設置中設置“電池不優(yōu)化”。
  • 根據(jù)之前的并發(fā)請求測試發(fā)現(xiàn),只會返回同一條數(shù)據(jù),而不是分別響應每一個接口請求。
    目前尚未找到適合的處理方式,暫且只能控制請求端的請求頻次。
  • 如果并發(fā)請求大,請不要使用NanoHTTPD,還是通過JAVA和Spring 來做服務。

到了這里,關(guān)于【NanoHTTPD】Android,使用NanoHTTPD搭建服務器,接受Http請求,最佳實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • Android-音視頻學習系列-(八)基于-Nginx-搭建(rtmp、http)直播服務器

    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日
    瀏覽(32)
  • 使用Python搭建代理服務器- 爬蟲代理服務器詳細指南

    使用Python搭建代理服務器- 爬蟲代理服務器詳細指南

    搭建一個Python爬蟲代理服務器可以讓你更方便地管理和使用代理IP。下面是一個詳細的教程來幫助你搭建一個簡單的Python爬蟲代理服務器: 1. 首先,確保你已經(jīng)安裝了Python。你可以在官方網(wǎng)站(https://www.python.org/)下載并安裝最新版本的Python。 2. 安裝所需的Python庫。打開終端或

    2024年02月15日
    瀏覽(27)
  • TFTP服務器搭建與使用

    TFTP服務器搭建與使用

    TFTP(Trivial File Transfer Protocol)也就是簡單文件傳輸協(xié)議,常用于無盤工作站等從別的主機獲取引導配置文件,由于TFTP報文較小,所以可以迅速復制這些文件。 TFTP是TCP/IP協(xié)議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸?shù)膮f(xié)議,提供不復雜、開銷不大的文件傳輸服

    2024年02月16日
    瀏覽(13)
  • 【服務器】安卓手機使用Termux搭建web服務

    【服務器】安卓手機使用Termux搭建web服務

    ??Yan-英杰的主頁 悟已往之不諫 知來者之可追 ?? C++程序員,2024屆電子信息研究生 目錄 概述 1.搭建apache 2.安裝cpolar內(nèi)網(wǎng)穿透 3.公網(wǎng)訪問配置 4.固定公網(wǎng)地址 5.添加站點 Termux是一個Android終端仿真應用程序,用于在 Android 手機上搭建一個完整的Linux 環(huán)境,能夠?qū)崿F(xiàn)Linux下的許

    2024年02月06日
    瀏覽(31)
  • 使用IIS服務器搭建一個網(wǎng)站

    使用IIS服務器搭建一個網(wǎng)站

    IIS全稱為Internet Information Services,是一種Web服務組件。通過在自己電腦上安裝好IIS服務,就可以把你自己的電腦當作一個網(wǎng)站的服務器。 Step1、 控制面板——程序——程序和功能——啟用或關(guān)閉windows功能 Step2、 重啟一下電腦,在開始菜單欄里面找到IIS服務 Step3、 進入IIS管理

    2024年02月05日
    瀏覽(97)
  • 搭建Git本地服務器及其使用

    GitHub就是一個免費托管開源代碼的遠程倉庫。但是對于某些視源代碼如生命的商業(yè)公司來說,既不想公開源代碼,又舍不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作為私有倉庫使用。 搭建Git服務器需要準備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過

    2024年02月13日
    瀏覽(42)
  • 使用docker搭建kms服務器

    使用docker搭建kms服務器

    僅個人工作時對操作步驟進行記錄,無任何安全、可行性保證,轉(zhuǎn)載請標注出處! 配置IP地址,使其可正常上網(wǎng)。 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日
    瀏覽(30)
  • nfs服務器的描述,搭建和使用

    nfs服務器的描述,搭建和使用

    前言 這是我在這個網(wǎng)站整理的筆記,關(guān)注我,接下來還會持續(xù)更新。 作者:RodmaChen NFS概述 NFS(Network File System)是一種基于網(wǎng)絡的文件系統(tǒng)協(xié)議,它允許不同的計算機系統(tǒng)通過網(wǎng)絡共享文件和目錄。本文將介紹NFS的工作原理、優(yōu)缺點以及掛載后客戶端創(chuàng)建文件服務端也會出

    2024年02月15日
    瀏覽(27)
  • 使用 Nginx 搭建文件下載服務器

    ??版權(quán)聲明:本文為CSDN博主「楊群」的原創(chuàng)文章,遵循 CC 4.0 BY-SA版權(quán)協(xié)議,于2023年8月27日首發(fā)于CSDN,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 ??原文鏈接:https://blog.csdn.net/u011046671/article/details/132526618 ??操作系統(tǒng):microsoft Windows 10 專業(yè)版 ??nginx 版本:1.25.1 ??使用

    2024年02月06日
    瀏覽(29)
  • VPS使用ProxySU搭建節(jié)點服務器

    VPS使用ProxySU搭建節(jié)點服務器

    本文所有教程及源碼、軟件僅為技術(shù)研究。不涉及計算機信息系統(tǒng)功能的刪除、修改、增加、干擾,更不會影響計算機信息系統(tǒng)的正常運行。不得將代碼用于非法用途,如侵立刪! VPS使用ProxySU搭建節(jié)點服務器 環(huán)境 contos8 win10 64位 ProxySU 4.1.7 服務器及域名相關(guān) vps服務器和域名

    2024年02月17日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包