Android http server

最近在玩Android的盒子,几十块一个,买来随便糟蹋。下面讲讲如何制作Android上的一个http server 并且可以处理post请求。

思路如下

1. 先找一个轻量的可以部署到Android上的库,这里不打算用native 来完成,jni那些还没玩熟,太耗时了。此外性能也不是关键点。

2. 主页是个页面,上面可以放置几个按钮,并且按钮可以点击,最终在Android 后端处理

2.1 了解了下ajax的,无法就是http的post请求,并且带上参数。

2.2. 在Android 后端收到post请求后,完成一定的业务。

3.拓展

1. nanohttpd库

直接gpt里面问了下,建议使用nanohttpd库,使用java 开发,轻量。

grade添加依赖

注意这里的地址是org.nanohttpd:xxxx:xxx ,overstack上能找到答案。好了之后sync 一下。

添加internet 权限,在AndroidManifest.xml 中声明internet,然后再代码中动态申请。(备注好像不需要,因为我开始的时候使用的1024以下的端口80,这个默认是不给用的,改起来太麻烦,放弃)

创建一个从nanoHTTPD派生的类,主要重载serve这个函数,应该是所有http的请求都在这里处理,所以要做复杂的操作,需要在里面根据uri去转发请求,或者处理对应的post,get请求。一般的方法如下

根据method 和uri来派遣,为了更好的模块化,可以定义更多的业务函数。我这里比较简单,就是返回一个页面,然后显示按钮,点击按钮post回请求。

2. 返回主页面

这里很简单,先用gpt生成一个10个按钮的页面,并且需要有css效果,点击按钮会post请求,自动代码就出来了。然后把html的内容全部复制给一个变量。

最终把response 返回即可。

按钮的js代码部分。主要是post 一个json过去。

3. post处理

自己根据post 和url 来处理post请求,先提取post的json串,然后拿到name。然后去执行业务。

我这里是模拟发送一个keycode 事件,(做的是一个按键点播小程序)

触发按键事件;跟USB键盘的效果一致。

根据post的name转换成keycode

因为整个程序的其余部分是根据按键去播放文件,为了对已有代码侵入修改最小这里使用模拟按键的方式来实现。

最终页面效果如下

这里只是完成了最低要求的功能,比如ajax请求成功,失败,弹框显示等等这些都没有。到这里正常情况下,已经可以和android的后端完成通信了。

4. 扩展部分

我们添加了对http的支持后,也可以很轻松的来支持socket

创建一个socketserver来处理客户端的连接,然后用clientthread 来服务客户端

这里就简单了,这里定义一个简单的协议,先发4字节的payload长度,然后payload,这里也不考虑心跳了,断了直接客户端自己重新连过来。

收到一个有效的payload 后,对内容解析,然后执行一个异步task。这里一样也是来模拟一个键盘事件达到播放的效果。

至此拓展功能基本完成。

Android客户端

根据通信协议,先发四个字节的长度,然后发送payload, 我这里直接发0,1,2这样的字符串,然后再服务器端转换。gpt大大提高了开发效率。不得不服。随便看个android 1,2周就可以玩初级的demo了。