android的app作为服务端首先其实要考虑保活的问题,但是这个暂不考虑,程序挂了就通讯不上了,再重新打开就是了,经过测试,在启动server之后让app进入后台,程序还是可以存活几个小时的(没有测试更长的时间,注意,这是在不开其他app的情况下,在开其他app的情况下有时进程会被kill)。
这里的通讯主要是在电脑端通过curl发送命令(url),然后android端处理数据并返回结果。
curl是利用URL语法在命令行方式下工作的开源文件传输工具。
这里我下载的是window下可执行程序curl,是在一个人分享到网盘的。在官网我没有找到可执行的curl,只找到了源码(要编译的)。虽然下面有人家的window端的下载链接,但是我之前没有找到(后面终于找到了)。
进这个网站
https://curl.haxx.se/download.html
一直往下拖。下这个。
我是win7 64位,因此使用I386下的curl.exe工具。
cmd进入控制台,然后通过cd命令进入到curl.exe所在的目录。
进入到该目录后,执行curl --help测试。
出现这些信息就表示curl可用。
试试输入这个,看是否能正常通讯。
curl https://www.baidu.com/
至此,curl可用,下面开始设置服务端。
git上有一些开源库可以用Nanohttpd、AndServer。
我之前用的Nanohttpd好像有点问题后来就弃用了(应该是我的锅。不过我还是感觉这个是用于java的我,因为我记得运行sample响应ok,但是上传文件好像有点问题,缺乏某些类),然后就用了AndServer。
AndServer地址:
https://github.com/yanzhenjie/AndServer
通过运行sample可以大致了解通讯的过程。
至于具体怎么添加到自己的项目中,在gradle中添加依赖,然后将sample中的代码copy到自己的项目中即可。
compile'com.yanzhenjie:andserver:1.0.3'
app运行之后,打开server,然后就可以进行通讯了。
比如,上传,命令如下:
curl -F "filename=@你好.txt" http://192.168.3.169:8080/upload
192.168.3.169是android设备的ip地址,8080是端口号。(本质是socket通讯?这方面我没有深入了解,http通讯?)
在测试上传功能过程中发现一个问题,包含中文字符的文件名传输到android端之后显示的是乱码(英文则不会出现此问题)。
上传文件默认保存在sdcard目录下。
解决方法:
在RequestUploadHandler类中设置传输的格式,具体代码:
fileUpload.setHeaderEncoding("gbk");
然后进行格式转换之后才能得到正确的中文字。
String s =newString(fileItem.getName().getBytes(),"UTF-8");
上传成功后会返回ok。
格式不一致然后导致了乱码(具体原因待分析,这是我偶然尝试上传gbk格式的中文然后发现此时android设备中的文件名没有乱码发现的)。
关于登录,demo中默认账号和密码为123。
if("123".equals(userName) &&"123".equals(password))
因此,发送命令。
curl -d "userName=123&password=123" http://192.168.3.169:8080/login
参考链接:
windows(64位)下使用curl命令
http://blog.csdn.net/wangchao729251283/article/details/54628826
Curl windows下载地址
http://blog.csdn.net/hongweigg/article/details/51728220