美文网首页
NanoHttpd 轻量级的 HTTP 服务器

NanoHttpd 轻量级的 HTTP 服务器

作者: Sharkchilli | 来源:发表于2021-06-07 21:15 被阅读0次

    前言

    其实主要讨论的是android中的RPC,但是在这之前我们得在Android中搭建一个HTTP服务器,来供我们远程访问。
    NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。可轻松定制临时文件使用和线程模型。

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

    Server搭建

    引入相关依赖

    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'
    

    创建我们的服务类

    
    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) {
            //打印请求数据
            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方法,在构造方法中调用了 super(PORT);用于监听指定端口。
    以后外部的所以访问都会调用serve方法。IHTTPSession 中封装了本次请求的相关信息,在这一段代码中我打印了一些信息。
    最后调用newFixedLengthResponse返回固定长度的结果

    Activity启动服务

    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启动服务,onDestroy关闭服务。其实这个步骤应该在Application中处理,这里为了方便就先这样了。

    运行

    启动app后访问收集app的ip


    image.png

    相关文章

      网友评论

          本文标题:NanoHttpd 轻量级的 HTTP 服务器

          本文链接:https://www.haomeiwen.com/subject/lirreltx.html