NanoHttpd 輕量級(jí)的 HTTP 服務(wù)器

前言

其實(shí)主要討論的是android中的RPC,但是在這之前我們得在Android中搭建一個(gè)HTTP服務(wù)器,來供我們遠(yuǎn)程訪問。
NanoHTTPD是一個(gè)免費(fèi)、輕量級(jí)的(只有一個(gè)Java文件) HTTP服務(wù)器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 請(qǐng)求,支持文件上傳,占用內(nèi)存很小??奢p松定制臨時(shí)文件使用和線程模型。

git地址:
https://github.com/NanoHttpd/nanohttpd

Server搭建

引入相關(guān)依賴

implementation 'org.nanohttpd:nanohttpd:2.3.1'
implementation 'com.github.briandilley.jsonrpc4j:jsonrpc4j:1.5.0'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5'

創(chuàng)建我們的服務(wù)類


public class MyServer extends NanoHTTPD {
    private Context mContext;
    private final static int PORT = 33445;
    public final static String TAG = "SharkChilli";

    public MyServer(Context context) throws IOException {
        super(PORT);
        this.mContext = context;
        start();
        Log.i(TAG, "MyServer start");
    }

    @Override
    public Response serve(IHTTPSession session) {
        //打印請(qǐng)求數(shù)據(jù)
        Log.i(TAG, "serve uri: " + session.getUri());
        Log.i(TAG, "serve getQueryParameterString: " + session.getQueryParameterString());
        Log.i(TAG, "serve getRemoteHostName: " + session.getRemoteHostName());
        Log.i(TAG, "serve getRemoteIpAddress: " + session.getRemoteIpAddress());
        session.getHeaders().forEach((key, val) -> {
            Log.i(TAG, key + " : " + val);
        });

        InputStream inputStream = session.getInputStream();
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();


        try {
            String msg = "<html><body><h1>Hello server</h1></body></html>";
            return newFixedLengthResponse(msg);
        } catch (Exception exception) {
            return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Internal Server Error!!!");
        }

    }
}

這里我們繼承了NanoHTTPD并且覆蓋了serve方法,在構(gòu)造方法中調(diào)用了 super(PORT);用于監(jiān)聽指定端口。
以后外部的所以訪問都會(huì)調(diào)用serve方法。IHTTPSession 中封裝了本次請(qǐng)求的相關(guān)信息,在這一段代碼中我打印了一些信息。
最后調(diào)用newFixedLengthResponse返回固定長(zhǎng)度的結(jié)果

Activity啟動(dòng)服務(wù)

public class MainActivity extends AppCompatActivity {
    public final static String TAG = "SharkChilli";

    private MyServer mMyServer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            mMyServer = new MyServer(this);
        } catch (IOException e) {
            Log.e(TAG, "WebServer start failed", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMyServer != null) {
            mMyServer.closeAllConnections();
            mMyServer = null;
            Log.e(TAG, "app pause, so web server close");
        }
    }
}

上面代碼就是onCreate啟動(dòng)服務(wù),onDestroy關(guān)閉服務(wù)。其實(shí)這個(gè)步驟應(yīng)該在Application中處理,這里為了方便就先這樣了。

運(yùn)行

啟動(dòng)app后訪問收集app的ip


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容