NanoHttpd 轻量级的 HTTP 服务器

2021-06-07  本文已影响0人  Sharkchilli

前言

其实主要讨论的是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
上一篇下一篇

猜你喜欢

热点阅读