Android使用NanoHttpd在app内搭建http server(一)

一、场景:

想没想过在自己的Android的 app里内嵌一个http server服务端,这样咱们就可以从PC和手机上的浏览器遥控app了。接下来就使用一个GitHub的开源库Nanohttpd在app内搭建一个小型http的server。开源库地址:GitHub - NanoHttpd/nanohttpd: Tiny, easily embeddable HTTP server in Java.

二、简单集成使用

引入依赖库:implementation 'org.nanohttpd:nanohttpd:2.3.1'

写一个类继承依赖库的NanoHTTPD.java,具体对外提供资源访问的代码在重写的serve方法中,

/**
 * Date: 2022/4/19
 * Author: SunBinKang
 * Description: 传入主机IP和自定义的端口号,这里的主机明要为安装app的那台设备的网络IP地址
 */
class HttpServerV1(hostname: String?, port: Int) : NanoHTTPD(hostname, port) {//继承NanoHTTPD

    private val TAG = "binkang"
    private var count = 0 //用于记录请求为第几次
    private var mGson: Gson = Gson() //用于记录请求为第几次


    override fun serve(session: IHTTPSession?): Response {
        return dealWith(session)
    }

    private fun dealWith(session: IHTTPSession?): Response {
        //日志输出外部请求相关的日志信息
        Log.i(
            TAG,
            "dealWith: session.uri = ${session?.uri}, method = ${session?.method}, header = ${session?.headers}, " +
                    "params = ${session?.parameters}"
        )
        //响应get请求
        if (Method.GET == session?.method) {

            if (session.uri == HTTP_URI_SAYSOMETHING) {
                count++
                val param = session.parameters
                return responseJsonString(
                    200,
                    "${param["name"]?.get(0)}, say somthing to me $count, ok?",
                    "请求成功!"
                )
            }

        } else if (Method.POST == session?.method) {//响应post请求
            //获取请求头数据
            val header = session.headers
            //获取传参参数
            val param = session.parameters

            return when (session.uri) {

                HTTP_URI_SUM -> {
                    var b: Int = param["number"]?.get(0).toString().toInt()
                    for (i in 0..100) {
                        b += 1
                    }
                    responseJsonString(200, b, "Success!")
                }

                HTTP_URI_HELLO -> responseJsonString(
                    200,
                    "Hello ${param["name"]?.get(0)} !",
                    "Success!"
                )

                else -> responseJsonString(404, "It's nothing!", "Success!")

            }
        }
        return responseJsonString(404, "", "Request not support!")
    }

    private fun <T : Any> responseJsonString(code: Int, data: T, msg: String): Response {
        val response = Responser<T>(code, data, msg)
        Log.i(TAG, "responseJsonString: $response")
        return newFixedLengthResponse(mGson.toJson(response))//返回对应的响应体Response
    }
}

再新建一个配置常量类:Config.kt

const val HTTP_IP = "10.153.205.27"//这是我当前手机流量下的IP地址
const val HTTP_PORT = 8080
const val HTTP_URL = "http://${HTTP_IP}:${HTTP_PORT}/"

/**
 * POST请求:
 * @param number (integer 数字)
 * {
 *   "code":200,
 *   "data":106,
 *   "msg":"请求成功!"
 * }
 */
const val HTTP_URI_SUM = "/api/sumHundredTime"

/**
 * POST请求:
 * @param name (String 数字)
 * {
 *   "code":200,
 *   "data":"Hello 叫啥来着 !",
 *   "msg":"请求成功!"
 * }
 */
const val HTTP_URI_HELLO = "/api/holleMan"

/**
 * GET请求:
 * @param name (String 数字)
 * {
 *   "code":200,
 *   "data":"哈哈哈哈, say somthing to me 1, ok?",
 *   "msg":"请求成功!"
 * }
 */
const val HTTP_URI_SAYSOMETHING = "/api/saySomething"

上面的IP是我手机流量下的IP地址:如果是连了WiFi的写上WiFi的IP地址也行,端口port自定义就行。

Responser.kt类

class Responser<T>(val code: Int, val data: T, val msg: String) {
}

然后就是在AndroidManifest.xml加上网络权限

<uses-permission android:name="android.permission.INTERNET" />

最后就是我们在mainActivity.java中启动这个server了:

class MainActivity : AppCompatActivity() {

    var mHttpServer: HttpServerV1? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mHttpServer = HttpServerV1(HTTP_IP, HTTP_PORT)
        //三种启动方式都行
//        mHttpServer.start()
//        mHttpServer.start(NanoHTTPD.SOCKET_READ_TIMEOUT)
        mHttpServer?.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false)
    }

    override fun onDestroy() {
        super.onDestroy()
        mHttpServer?.stop()//停止
    }
}

以上就完成了。说明一下我的build.gradle环境

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.nanohttpd"
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'org.nanohttpd:nanohttpd:2.3.1'
    implementation 'com.google.code.gson:gson:2.8.6'
}

运行试试,手机浏览器访问成功:

电脑postman访问get请求:

 

 这样在android中,一个简单的http server就搭建好了。

后续会上传项目到GitHub上。代码地址在下一篇的文章最后面~。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用Android Studio中的nanohttpd库创建HTTP服务器,并使用WebView打开HTML页面的步骤如下: 1. 首先,在build.gradle文件中的dependencies块中添加依赖项: ``` implementation 'org.nanohttpd:nanohttpd-webserver:2.3.1' ``` 2. 在需要创建HTTP服务器的Activity中,创建一个继承自NanoHTTPD的子类。例如: ```java public class MyServer extends NanoHTTPD { public MyServer() { super(8080); // 设置服务器端口为8080 } @Override public Response serve(IHTTPSession session) { String uri = session.getUri(); // 获取请求的URI // 判断请求的URI是否为根目录,如果是,则返回HTML页面,否则返回404错误 if (uri.equals("/")) { try { InputStream inputStream = getAssets().open("index.html"); // 打开assets文件夹中的index.html文件 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } reader.close(); inputStream.close(); String html = builder.toString(); return newFixedLengthResponse(Response.Status.OK, "text/html", html); // 返回HTML页面 } catch (IOException e) { e.printStackTrace(); } } return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "404 Not Found"); // 返回404错误 } } ``` 3. 在Activity中启动HTTP服务器,并使用WebView打开页面: ```java WebView webView = findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); // 允许WebView执行JavaScript代码 MyServer server = new MyServer(); try { server.start(); // 启动HTTP服务器 } catch (IOException e) { e.printStackTrace(); } webView.loadUrl("http://localhost:8080/"); // 使用WebView打开服务器的根目录页面 ``` 以上就是使用NanoHTTPD创建HTTP服务器并使用WebView打开HTML页面的过程。在实际开发中,可以根据需要进行相应的修改和扩展。 ### 回答2: 要使用Android Studio创建一个HTTP服务器并打开HTML页面,可以使用NanoHTTPD库来实现。 首先,需要在项目的`build.gradle`文件中添加NanoHTTPD的依赖项。在`dependencies`部分添加以下代码: ``` implementation 'org.nanohttpd:nanohttpd:2.3.1' ``` 接下来,在你的Activity或Fragment中创建一个NanoHTTPD的子类,例如`MyServer`。这个子类需要实现`NanoHTTPD.IHTTPD`接口,并重写`serve()`方法来响应HTTP请求。在这个方法中,你可以通过判断请求URI来确定要返回给客户端的内容。 具体代码如下: ```java import android.content.Context; import android.webkit.WebView; import android.widget.Toast; import org.nanohttpd.protocols.http.IHTTPSession; import org.nanohttpd.protocols.http.NanoHTTPD; import org.nanohttpd.protocols.http.response.Response; import org.nanohttpd.protocols.http.response.Status; import java.io.IOException; public class MyServer extends NanoHTTPD { private Context context; public MyServer(Context context) { super(8080); this.context = context; } @Override public Response serve(IHTTPSession session) { String uri = session.getUri(); if (uri.equals("/index.html")) { String html = "<html><body><h1>Hello, World!</h1></body></html>"; return newFixedLengthResponse(Response.Status.OK, "text/html", html); } else { return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "404 Not Found"); } } } ``` 然后,在你的Activity或Fragment中,可以通过创建一个WebView来加载HTML页面,并启动NanoHTTPD服务器。具体代码如下: ```java import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private WebView webView; private MyServer server; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient()); server = new MyServer(this); try { server.start(); Toast.makeText(this, "Server started", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } webView.loadUrl("http://localhost:8080/index.html"); } @Override protected void onDestroy() { super.onDestroy(); if (server != null) { server.stop(); } } } ``` 在XML布局文件中添加一个WebView用于显示HTML页面。 这样,当你运行这个应用时,会在Android设备上启动一个HTTP服务器,并使用WebView加载服务器上的HTML页面。 ### 回答3: 使用Android Studio创建HTTP服务器并在WebView中打开HTML页面需要以下步骤: 1. 首先,将nanohttpd库导入到Android Studio项目中。可以通过在项目的build.gradle文件中添加以下行来实现: ```groovy dependencies { implementation 'org.nanohttpd:nanohttpd:2.3.1' } ``` 2. 创建一个新的Java类,继承自`NanoHTTPD`类,用于实现HTTP服务器。在这个类中,需要重写NanoHTTPD的`serve()`方法,来处理HTTP请求和响应。通过使用`InputStream`读取HTML文件的内容,并将其响应给请求的客户端。 ```java public class MyHTTPServer extends NanoHTTPD { // 构造方法 public MyHTTPServer() { super(8080); } @Override public Response serve(IHTTPSession session) { String uri = session.getUri(); if (uri.equals("/")) { uri = "/index.html"; } try { InputStream inputStream = getApplicationContext().getAssets().open(uri.substring(1)); String mimeType = "text/html"; return newChunkedResponse(Response.Status.OK, mimeType, inputStream); } catch (IOException e) { e.printStackTrace(); return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "File not found"); } } } ``` 3. 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 4. 在Activity的`onCreate()`方法中启动HTTP服务器并加载WebView: ```java public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 启动HTTP服务器 MyHTTPServer server = new MyHTTPServer(); try { server.start(); } catch (IOException e) { e.printStackTrace(); } webView = findViewById(R.id.webView); // 允许WebView执行JavaScript代码 webView.getSettings().setJavaScriptEnabled(true); // 加载HTTP服务器的地址 webView.loadUrl("http://localhost:8080"); } } ``` 以上是在Android Studio中使用NanoHTTPD库创建HTTP服务器并在WebView中打开HTML页面的步骤。可以根据需要对服务器和WebView进行进一步的自定义和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值