原生Android也能做Web开发了

原生Android也能做Web开发了

版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目——AndServer

开源地址:https://github.com/yanzhenjie/AndServer

AndServer是一个Android端的Web服务器,类似Apache或者Tomcat,但又有不同,它是一个普通的Android Library,Android项目Gradle远程依赖或者添加Jar包皆可引入该项目,然后就通过正常Android开发一样开发App了。

AndServer是用纯Android API写一个库,所以不用任何第三方的库或者什么硬件编译,打成Jar包后仅仅580kb。

很多人看到这里就有疑问了:它的使用场景是什么?按照国际惯例,我举个栗子:

某公司公开了一款TV APP,可以安装在电视或者盒子上,有一个功能是这样的:

APP安装在电视上打开后,会生成一个唯一ID,用户用微信扫码通过公司提供的公众号和该电视上的该APP绑定,用户通过公众号打开一个H5页面,这个页面可以上传图片或者视频到服务器,服务器检测到该用户和某个屏幕的APP绑定,动态把用户发送的图片或者视频发送到电视播放。

这样一个功能是很好的体验,但是耗费服务器资源、远端上传、远端下载也都需要时间,还不如我直接用U盘拷贝到电视呢。那么如果我通过网页在局域网直接把视频或者图片发送到电视上的APP播放,岂不是更加直接快捷?

当然大部分同学可能很少接触到APP之间互相在局域网通信、局域网上传下载、局域网登录这样的需求,还有很多栗子我就不举了,下面开始正式安利。


特点

  1. 接受客户端文件上传、下载文件。
  2. 动态Http API,就像Java的Servlet一样写接口。
  3. 部署静态网站,例如纯Html,支持JS、CSS、Image分离。
  4. 部署动态网站,例如Html表单,当然可以结合上面的Android Http接口。

基本上和Java的Servlet一样的功能,如果你做过Java开发或者其它语言的Web开发应该就很熟悉了。

依赖

  • Gradle
compile ‘com.yanzhenjie:andserver:1.0.2‘
  • Maven
<dependency>
  <groupId>com.yanzhenjie</groupId>
  <artifactId>andserver</artifactId>
  <version>1.0.2</version>
  <type>pom</type>
</dependency>
  • ADT,可以去AndServer主页下载Jar包。

使用方法

最好的教程是sample,建议到AndServer主页下载sample运行查看效果,然后结合README就更加清晰了。

创建服务器

AndServer andServer = new AndServer.Build()
    ...
    .build();

// 创建服务器。
Server mServer = andServer.createServer();
...

// 启动服务器。
mServer.start();
...

// 停止服务器。
mServer.stop();
...

// 服务器正在运行吗?
boolean running = mServer.isRunning();

端口号和响应超时设置

AndServer andServer = new AndServer.Build()
    .port(8080) // 默认是8080,Android平台允许的端口号都可以。
    .timeout(10 * 1000) // 默认10 * 1000毫秒。
    ...
    .build();
...

部署网站

部署网站是通过Website接口,你也可以自己实现这个接口,当然AndServer已经提供了两个默认实现:

  • AssetsWebsite
  • StorageWebsite

如果用上面两个实现注册你的网站,那么你的默认首页(index.html)是:

http://ip:port/
http://ip:port/youPath
http://ip:port/youPath/index.html

注册网站到AndServer

Wesite wesite = new AssetsWebsite(AssetManager, youPath);
// 或者
Wesite wesite = new StorageWebsite(youPath);

AndServer andServer = new AndServer.Build()
    ...
    .website(wesite);
    .build();

AssetsWebsite的使用

如果你的网站在assets下,那么你就用AssetsWebsite来部署你的网站。

使用方法是:

//AssetManager不能被关闭。
AssetManager mAssetManager = getAssets();

Wesite wesite = new AssetsWebsite(mAssetManager, youPath);

上面我们看到new AssetsWebsite时需要传一个AssetManager和一个path,path支持assets根目录和子目录,下面是这两种情况的举例。

  • 如果你的网站在assets根目录下, 你的path就填"",比如:

Wesite wesite = new AssetsWebsite(mAssetManager, "");

那么你的默认首页访问地址就是:

http://ip:port
http://ip:port/index.html

那么你的其它页面访问地址是:

http://ip:port/login.html
http://ip:port/error.html

比如:

http://192.168.1.12:8080/index.html
http://192.168.1.12:8080/login.html
  • 如果你的网站根目录在assets的子目录下,那么你传入assets的相对目录地址就好了比如你的网站在assetsweb目录,例如:

Wesite wesite = new AssetsWebsite(mAssetManager, "web");

那么你的默认首页访问地址就是:

http://ip:port
http://ip:port/web
http://ip:port/web/index.html

那么你的其它页面访问地址是:

http://ip:port/web/login.html
http://ip:port/web/error.html

例如:

http://192.168.1.12:8080/
http://192.168.1.12:8080/index.html
http://192.168.1.12:8080/web/index.html
http://192.168.1.12:8080/web/index.html
http://192.168.1.12:8080/web/login.html

StorageWebsite的使用

如果你的网站在内存设备下,只要以文件的形式可以读取到,那么你就用StorageWebsite来部署你的网站,比如你的网站在SD卡下时。

使用方法是:

Wesite wesite = new StorageWebsite(youPath);

它很简单,只要传入你的网站的存储目录地址即可,例如你的网站在SD卡下的www目录:

File file = new File(Environment.getExternalStorageDirectory(), "www");
String websiteDirectory = file.getAbsolutePath();

Wesite wesite = new StorageWebsite(websiteDirectory);

访问地址和AssetsWebsite的道理相同。

像Servlet一样写Http接口

Http API是通过RequestHandler接口来注册的,它是一个java interface,它和JavaServlet一样。

你需要实现这个接口,然后在AndServer注册即可,例如:

public class RequestLoginHandler implements RequestHandler {

    @Override
    public void handle(HttpRequest req, HttpResponse res, HttpContext con) {
        Map<String, String> params = HttpRequestParser.parse(request);

        // Request params.
        String userName = params.get("username");
        String password = params.get("password");

        if ("123".equals(userName) && "123".equals(password)) {
            StringEntity stringEntity = new StringEntity("Login Succeed", "utf-8");
            response.setEntity(stringEntity);
        } else {
            StringEntity stringEntity = new StringEntity("Login Failed", "utf-8");
            response.setEntity(stringEntity);
        }
    }
}

然后在AndServer中注册:

AndServer andServer = new AndServer.Build()
    ...
    .registerHandler("login", new RequestLoginHandler())
    .build();

现在你就得到了一个唯一的访问地址:http://ip:port/login, 例如:

http://192.168.1.12:8080/login?username=123&password=123

文件下载和文件上传的例子请下载sample查看。

提交Html表单到Android端

Htmlformaction中填入你注册RequestHandler时的key就可以了,然后在RequestHandler

handle(HttpRequest, HttpResponse, HttpContext)

方法就可以获取form提交的参数了。

比如我们上面注册Login RequestHandlerform中这样使用:

<form id="form1" method="post" action="login">
...
</form>

监听服务器的状态

服务器一般情况下有三种状态:成功启动、启动时失败、成功停止服务器,失败时会返回一个异常,一般情况下是网络问题或者端口被占用。

private Server.Listener mListener = new Server.Listener() {
    @Override
    public void onStarted() {
        // 服务器启动成功.
    }

    @Override
    public void onStopped() {
        // 服务器停止了,一般是开发者调用server.stop()才会停止。
    }

    @Override
    public void onError(Exception e) {
        // 服务器启动发生错误,一般是端口被占用。
    }
};

AndServer andServer = new AndServer.Build()
    ...
    .listener(mListener)
    .build();

如果你觉得还不错,请关注我的微信公众号吧


版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com

时间: 2024-10-10 23:36:46

原生Android也能做Web开发了的相关文章

做web开发需要学习哪些技术--基础篇

做一个web网站,包含哪些技术,自己需要学习哪些技术 自己想到哪里就写到哪里 -- 给自己做的一个记录 1: 页面的展示, 一个web的开发语言  1.1 一个web的开发语言需要注意哪方面,才能符合你的网站业务发展     1:语言的选择     2:框架的设计 - 怎么符合未来业务的发展     3:对于业务的了解     4:了解http协议      那么就要了解tcp/ip协议 3: web安全     web安全又有哪些方面需要注意的呢     3.1 xss     3.2 sql

学JavaScript,做web开发

有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了在麦子学院学习的时光,那时候我用 Pascal.Fortran.C和汇编语言,不过那个时候有不同的目标. 想做web开发,就学JavaScript 鉴于当前的状况和趋势,答案相对容易给出来:学习 JavaScript.四周看看,曾经低端的浏览器脚本语言现在变得随处可见,从服务器端到客户端,每天好像有更多的选择. 出身低微 我记得数年前投入 web 开发,学习了 HTML.用 Perl 开发 CGI 脚本.N

【黑马Android】(17)web开发/tomcat/HTTP协议

web开发概述 静态web资源:内容是静态的,不同的人在不同的时间来访问时都是相同的内容.HTML.CSS.JS 动态web资源:内容是由程序生成的,不同的人在不同的时间访问的内容很可能是不同的. 常见的动态web资源开发技术: ASP.PHP.JSP/Servlet C/S B/S之争 云.移动互联网.html5.物联网 tomcat的安装配置 下载地址:http://tomcat.apache.org/ 安装目录不能包含中文和空格 JAVA_HOME环境变量指定Tomcat运行时所要用的jd

想做web开发 就学JavaScript

有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了大学,那时候我用 Pascal.Fortran.C和汇编语言,不过那个时候有不同的目标. 鉴于当前的状况和趋势,答案相对容易给出来:学习 JavaScript.四周看看,曾经低端的浏览器脚本语言现在变得随处可见,从服务器端到客户端,每天好像有更多的选择. 出身低微 我记得数年前投入 web 开发,学习了 HTML.用 Perl 开发 CGI 脚本.Netscape 在其 2.0 版本的浏览器里引入了一种叫做

Python做web开发,推荐几个能立马上手的小项目

Python这门优美的语言是非常适合web开发的,基于Python的Django框架简单便捷且很强大. 那么作为新手该如何上手这门语言?一切不敲代码的学编程手段都是扯淡,今天就推荐一些适合新手练手的Python项目 1.Python开发小型搜图引擎 部分思路及代码如下 运行效果如下: 连接数据库 项目整体运行效果 在开发过程中,需要涉及一些数据结构的知识,使用文本界面的屏幕绘图库 ncurses用字符绘图,以及一些 Linux 的系统调用. ●学习过程中你能学会: 1. python web开发

做WEB开发的时候,前端与后端我们应该要注意哪些细节,哪些容易出现的漏洞?

写这篇文章的时候,我和团队正在处理项目漏洞问题,发现这些都是细节但又容易在项目实现的过程中忽视的部分,鉴于此,我想总结下来,方便以后出现类似问题能及时得到解决. 1.任意文件上传漏洞.   描述:允许用户上传任意文件可能让攻击者注入危险内容或恶意代码,并在服务器上运行. 利用:文件上传可以修改后缀导致可以上传任意文件,任意文件上传后都会返回SUCCESS成功. 方案:通过获取文件流对文件信息头部某些特殊的信息进行验证判断,这样及时想通过修改文件后缀也没法蒙骗过关.具体代码操作可参考这篇博文, h

使用eclipse+Tomcat+mysql做web开发时乱码问题解决

---恢复内容开始--- 在eclpse中设置:1.Windows->Preferences->General->Content Types->Text->Default encoding:utf-8 2.Windows->Preferences->General->Workspace->Text file encoding->Other:UTF-8 Tomcat设置:打开Tomcat文件夹下面的conf中的server.xml文件找到 <

百思不得其解—这些年做Web开发遇到的坑?

请教一个问题:Bootstrap 模态框modal里面的嵌入 iframe ,然后iframe 里面载入的是优酷的视频 ,现在的问题是:这个模态框在谷歌浏览器上面可以播放出视频,而在ff浏览器里面无法播放视频(这里用的是summernote 编辑器载入的) 页面源码里面有对应的视频地址 :不知道解决思路了 ? 如果是单独的一个界面载入视频 在ff下是正常的 ,参见上面的测试截图 参见下面几个东西了解富文本编辑器 1. 基于jquery的bootstrap在线文本编辑器插件Summernote 2

用VScode 做web开发用到的插件

HTML + CSS用到的插件 Auto Rename Tag Beautify Chinese (Simplified) Lang ESLint HTML CSS Support HTML Snippets HTMLHint Open HTML in Default Broser Path Autocomplete vetur JAVASCRIPT用到的插件 javascript(ES6)code snipets quokka Bracket Pair Colorizer TODO Highl