搭建Android上的服务器 “实现隔空取物”

本文介绍了如何使用Android的AsyncHttpServer创建一个基本的Web服务器,处理GET请求并返回静态HTML和动态JSON数据,以及如何扩展服务以支持文件浏览和视频流传输。作者强调了清晰表达和理解技术的重要性,同时提供了学习资源链接。
摘要由CSDN通过智能技术生成

然后我们在assets下编写一个html文件用于浏览器访问,index.html

最简单的即可:

嘿嘿嘿,连通了…

启动服务,监听端口

public class MainActivity extends AppCompatActivity {

private AsyncHttpServer server = new AsyncHttpServer();

private AsyncServer mAsyncServer = new AsyncServer();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

server.get(“/”, new HttpServerRequestCallback() {

@Override

public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {

try {

response.send(getIndexContent());

} catch (IOException e) {

e.printStackTrace();

response.code(500).end();

}

}

});

server.listen(mAsyncServer, 54321);

}

@Override

protected void onDestroy() {

super.onDestroy();

if (server != null) {

server.stop();

}

if (mAsyncServer != null) {

mAsyncServer.stop();

}

}

private String getIndexContent() throws IOException {

BufferedInputStream bInputStream = null;

try {

bInputStream = new BufferedInputStream(getAssets().open(“index.html”));

ByteArrayOutputStream baos = new ByteArrayOutputStream();

int len = 0;

byte[] tmp = new byte[10240];

while ((len = bInputStream.read(tmp)) > 0) {

baos.write(tmp, 0, len);

}

return new String(baos.toByteArray(), “utf-8”);

} catch (IOException e) {

e.printStackTrace();

throw e;

} finally {

if (bInputStream != null) {

try {

bInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

可以看到很简单,创建AsyncHttpServer对象,我们在onCreate中调用get,对外设置一个get型的url监听,监听的url是/即根目录。

然后调用listen,传入端口号54321,开启对该端口的监听。

onDestroy的时候停止服务器。

当捕获到对”/”的访问时,读取assets下的index.html返回给浏览器。

记得添加网络权限。

好了,运行demo,测试一下。

输入地址,你的手机的IP:端口号。

注意电脑和手机在同一个网段!

然后你应该看到如下效果图:

gekong05.png

如果没看到,那不用往下了,先找问题吧~

完善Demo

接下来,我们将手机上的mp4返回让其在浏览器上显示。

很简单,既然我们可以监听/,返回一个index.html,我们就能监听另一个url,返回文件目录。

server.get(“/files”, new HttpServerRequestCallback() {

@Override

public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {

JSONArray array = new JSONArray();

File dir = new File(Environment.getExternalStorageDirectory().getPath());

String[] fileNames = dir.list();

if (fileNames != null) {

for (String fileName : fileNames) {

File file = new File(dir, fileName);

if (file.exists() && file.isFile() && file.getName().endsWith(“.mp4”)) {

try {

JSONObject jsonObject = new JSONObject();

jsonObject.put(“name”, fileName);

jsonObject.put(“path”, file.getAbsolutePath());

array.put(jsonObject);

} catch (JSONException e) {

e.printStackTrace();

}

}

}

}

response.send(array.toString());

}

});

我们监听/files这个Url,然后返回Sdcard根目录的视频文件,拼接成JSON返回。

这里如果你重新启动,在浏览器上输入:

http://192.168.1.100:54321/files

会看到一堆JSON数据:

gekong06.png

但是我们需要在刚才的html上显示,所以这个请求应该是刚才的Html页面发起:

文档的标题

    可能很多朋友没了解过js,不过应该能看明白,$.getJSON获取返回的JSON数组,然后遍历为每个Json对象生成一个li标签,添加到页面上。

    这里用了jquery,对于js的也需要也请求处理,这里省略了,很简单,看源码即可。

    此时访问,已经可以显示出视频目录了:

    gekong07.png

    接下来就是点击播放了,在html里面有个标签叫video用于播放视频的,他有个src属性用于设置播放的视频路径。

    所以我们要做的仅为:

    • 点击名字,拿到该视频对应的url,然后设置给video的src属性即可。

    那么视频的url是什么?

    刚才我们返回了视频的路径,所以我们只要再监听一个url,将根据传入的视频路径,将视频文件流返回即可。

    server.get(“/files/.*”, new HttpServerRequestCallback() {

    @Override

    public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {

    String path = request.getPath().replace(“/files/”, “”);

    try {

    path = URLDecoder.decode(path, “utf-8”);

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    }

    File file = new File(path);

    最后

    今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

    最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

    还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

    【算法合集】

    【延伸Android必备知识点】

    【Android部分高级架构视频学习资源】

    **Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

    网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

    需要这份系统化学习资料的朋友,可以戳这里获取

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    oid部分高级架构视频学习资源】**

    **Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

    网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

    需要这份系统化学习资料的朋友,可以戳这里获取

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值