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) {//继承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(一)相关推荐
- mtk android apk lib,Android MTK 拷贝第三方App 内置apk文件到系统目录
MTK 的第三方App文件或者so库,都存在在Vendor目录下面 vendor\retch\thirdapp 我们要实现App 的拷贝,可以在pacakage\apps 下面去新建一个文件夹Retc ...
- android webview 百度地图,APP内的网页怎么调起地图导航服务
高德地图和百度地图可以用scheme调起地图,具体可参考API,里面讲的很清楚,配置好相应的Schema之后根据例子使用就好了. 百度:http://lbsyun.baidu.com/index... ...
- 友盟开放日: 通过 App 内社区提高留存率的 6 个技巧
很多开发者都有这样的疑问:应用内社区究竟能够将 App 的用户留存率提升多少? 在日前友盟开放日深圳站中,友盟微社区产品负责人陆义元给出了答案:通过有效的社区运营能够将次日留存提升最少 5%,最高达到 ...
- App工程结构搭建:几种常见Android代码架构分析
原文:http://mobile.51cto.com/abased-386212.htm 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优 ...
- 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)
使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 传送门 转载于:https://www.cnblogs.com/momozjm/p/9389912.html
- android 禁止屏幕放大缩小,禁止APP内Webview页面跟随系统缩放字号
最近开始做适配移动端的网页,通过APP内部的Webview展示.为了在不同分辨率的设备上都能按相同的布局来展示,使用了rem布局的页面自适应方式: (function (doc, win) { var ...
- Android——App内文件分享功能
国内的Android开发者,在遇到App内有分享功能时,基本都是对接友盟分享.ShareSDK分享等第三方SDK.简单的集成SDK以及配置之后,即可分享至多个不同App平台.反而很少来使用Androi ...
- android 如何保存网页图片格式,求助,如何在安卓app内嵌的H5页面里长按保存图片?...
最近要做个在H5页面里长按保存图片的功能,已经找了个第三方插件html2canvas解决了在浏览器和在ios app的长按保存,但是这个插件在android app里失效了,所以得单独处理androi ...
- Android App内截屏监控及涂鸦功能实现
Android App内截屏监控及涂鸦功能实现 Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操 ...
- android打开另外的app两种方式,内置到自己本身的app,重新打开app,
android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...
最新文章
- matlab 互信息函数,MATLAB 互信息函数
- Android - Manifest 文件 详解
- 智能车竞赛技术报告 | 节能信标组 - 华南理工大学 - 华工雨花队
- java框架知识_java框架知识点总结
- pl0源码(可在delphi7中运行)
- !KMP算法完整教程
- 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
- 如何理解封装java_理解 Java 的三大特性之封装
- hadoop ha 参考
- php缓存静态化设计,PHP使用OB缓存实现静态化功能示例
- 富文本功能实现vue3.0
- mysql innodb 分区_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
- RJ45口线序的理解
- ABB机器人伺服电机维修故障
- PPT图形绘制:端午节PPT模板背景
- 超实用的几款Macos/Macbook/iMac 影片剪辑软件
- IDEA如何快速切换项目(快捷键切换)
- 图片优化——质量与性能的博弈
- 2007年中国网络游戏市场分析及投资咨询报告(上下卷)
- 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发...
热门文章
- 如何自动生成测试用例方案
- 深度学习之torch(一)MINIST手写字符分类
- 如何调整金格电子章服务器印章_【​金格统一电子印章平台V2.0】版本正式发布!...
- ADB连接手机遇到的问题:list of devices attached
- 解决edge浏览器中idm插件不能自动捕捉下载链接的问题
- 【大数据面试宝典】 第一篇 Hadoop 面试题
- 《凤凰项目 一个IT运维的传奇故事》读后感
- 笔记本BIOS启动项中找不到新装的固态硬盘解决
- leetcode第1282题
- 【8015】对做产品有帮助的行外书