一、场景:

想没想过在自己的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) {//继承NanoHTTPDprivate 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.parametersreturn 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.parametersreturn 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? = nulloverride 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 30buildToolsVersion "30.0.2"defaultConfig {applicationId "com.example.nanohttpd"minSdkVersion 19targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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上。代码地址在下一篇的文章最后面~。

Android使用NanoHttpd在app内搭建http server(一)相关推荐

  1. mtk android apk lib,Android MTK 拷贝第三方App 内置apk文件到系统目录

    MTK 的第三方App文件或者so库,都存在在Vendor目录下面 vendor\retch\thirdapp 我们要实现App 的拷贝,可以在pacakage\apps 下面去新建一个文件夹Retc ...

  2. android webview 百度地图,APP内的网页怎么调起地图导航服务

    高德地图和百度地图可以用scheme调起地图,具体可参考API,里面讲的很清楚,配置好相应的Schema之后根据例子使用就好了. 百度:http://lbsyun.baidu.com/index... ...

  3. 友盟开放日: 通过 App 内社区提高留存率的 6 个技巧

    很多开发者都有这样的疑问:应用内社区究竟能够将 App 的用户留存率提升多少? 在日前友盟开放日深圳站中,友盟微社区产品负责人陆义元给出了答案:通过有效的社区运营能够将次日留存提升最少 5%,最高达到 ...

  4. App工程结构搭建:几种常见Android代码架构分析

    原文:http://mobile.51cto.com/abased-386212.htm 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优 ...

  5. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)

    使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 传送门 转载于:https://www.cnblogs.com/momozjm/p/9389912.html

  6. android 禁止屏幕放大缩小,禁止APP内Webview页面跟随系统缩放字号

    最近开始做适配移动端的网页,通过APP内部的Webview展示.为了在不同分辨率的设备上都能按相同的布局来展示,使用了rem布局的页面自适应方式: (function (doc, win) { var ...

  7. Android——App内文件分享功能

    国内的Android开发者,在遇到App内有分享功能时,基本都是对接友盟分享.ShareSDK分享等第三方SDK.简单的集成SDK以及配置之后,即可分享至多个不同App平台.反而很少来使用Androi ...

  8. android 如何保存网页图片格式,求助,如何在安卓app内嵌的H5页面里长按保存图片?...

    最近要做个在H5页面里长按保存图片的功能,已经找了个第三方插件html2canvas解决了在浏览器和在ios app的长按保存,但是这个插件在android app里失效了,所以得单独处理androi ...

  9. Android App内截屏监控及涂鸦功能实现

    Android App内截屏监控及涂鸦功能实现 Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操 ...

  10. android打开另外的app两种方式,内置到自己本身的app,重新打开app,

    android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...

最新文章

  1. matlab 互信息函数,MATLAB 互信息函数
  2. Android - Manifest 文件 详解
  3. 智能车竞赛技术报告 | 节能信标组 - 华南理工大学 - 华工雨花队
  4. java框架知识_java框架知识点总结
  5. pl0源码(可在delphi7中运行)
  6. !KMP算法完整教程
  7. 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
  8. 如何理解封装java_理解 Java 的三大特性之封装
  9. hadoop ha 参考
  10. php缓存静态化设计,PHP使用OB缓存实现静态化功能示例
  11. 富文本功能实现vue3.0
  12. mysql innodb 分区_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
  13. RJ45口线序的理解
  14. ABB机器人伺服电机维修故障
  15. PPT图形绘制:端午节PPT模板背景
  16. 超实用的几款Macos/Macbook/iMac 影片剪辑软件
  17. IDEA如何快速切换项目(快捷键切换)
  18. 图片优化——质量与性能的博弈
  19. 2007年中国网络游戏市场分析及投资咨询报告(上下卷)
  20. 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发...

热门文章

  1. 如何自动生成测试用例方案
  2. 深度学习之torch(一)MINIST手写字符分类
  3. 如何调整金格电子章服务器印章_【​金格统一电子印章平台V2.0】版本正式发布!...
  4. ADB连接手机遇到的问题:list of devices attached
  5. 解决edge浏览器中idm插件不能自动捕捉下载链接的问题
  6. 【大数据面试宝典】 第一篇 Hadoop 面试题
  7. 《凤凰项目 一个IT运维的传奇故事》读后感
  8. 笔记本BIOS启动项中找不到新装的固态硬盘解决
  9. leetcode第1282题
  10. 【8015】对做产品有帮助的行外书