自己动手——快速搭建Android应用服务器

章节索引

  • Motivation
  • 一、针对网站和APP的服务端程序的区别
  • 二、我需要准备什么?
    • 硬件要求:
    • 软件要求:
    • 知识储备要求:
      • 1.基础Java知识和基础Java编程能力:
      • 2.计算机网络基础知识:
      • 3.数据库相关知识:
  • 三、我该选择哪一套方案?
  • 四、Android客户端发送Http请求和接收到应答的流程
  • 五、基础实现
  • 六、进阶知识
  • 更新日志
  • 后记


Motivation

我写这套博文的目的,是在自己学会、实现并熟练掌握之后,想帮助下面将会提到的这样一群正在学习Android的初学者,通过将自己的经验传递出去,让他们少走一点弯路,节省大量用在查询和翻阅资料上的时间。

我在学习编写自己的Android应用程序服务器的时候遇到过以下的问题:
1.我需要准备什么?
2.我该选择哪一套实现方案?

这些问题的搜索和查证都需要占用大量的时间,以至于初学者们手头的项目可能长达几个月没有进展,而我会一一为大家解决这些问题,你只需要花费看这一篇博文的时间。


好了,言归正传:

一、针对网站和APP的服务端程序的区别

大部分的程序逻辑和代码结构都是一样的,仅仅在响应客户端请求时,针对浏览器返回的是用户需要看到的新的页面,而针对APP返回的是一段数据(如是否登录成功等),APP客户端根据这些数据再来跳转页面。


二、我需要准备什么?

硬件要求:

一台用作服务器的联网电脑(可以购买云服务器或者用自己的PC)

软件要求:

安装JDK并配置完环境变量 (本套博文统一采用JDK 1.8)
还有一些软件是需要用到的,到了具体的章节我们再引入。

知识储备要求:

1.基础Java知识和基础Java编程能力:

也不需要对Java有多么深的理解,但是Java面向对象的三大要素——封装、继承、多态——至少要理解得清清楚楚!如果连静态方法和非静态方法都搞不清楚,那还怎么写程序?!

2.计算机网络基础知识:

对以下概念有较清晰的认识即可(不清楚的借一本计算机网络或者分条去查都可以快速搞明白):
①内网与外网;②局域网;③IP地址;④端口号;⑤Http请求;

3.数据库相关知识:

不会的必须找本书仔细学习一下。这个就不是随便查查就能懂的了。且有的知识(如范式)逻辑性较强,需要花时间认真学习。


三、我该选择哪一套方案?

在具有了一台联网电脑这一硬件条件后,我们的服务器仅仅有了一个容器,真正能让它工作起来的是一套软件相关的东西,那么我们就会去查,但是很遗憾,我们查到的99%的结果是网站服务器搭建,且博文1说A+B+C可以实现服务器,博文2又说A+D+E可以实现服务器…各种博文又抛出了一堆的框架。对于初学者来说,我就是交个毕设,或者仅仅需要支持一两个用户(自己和团队成员)的测试服务器,需要这么多概念吗?作为初学者到底应该学什么?

以上的问题并非捏造,确实是博主之前面临到的问题,现在给大家一个“标答”:

我们用:MySQL + Java Web + Tomcat + Volley 来实现我们的服务器。

其中:
①MySQL是开源的数据库软件;
②Java Web是遵循Java语言风格的服务器应用程序组件(即客户端发来的请求的应答者);
③Tomcat是开源的服务器软件(作为Java Web应用程序的容器);
④Volley是谷歌官方为Android提供的Http请求库(写在Android客户端,用于向服务器端发送请求)。


四、Android客户端发送Http请求和接收到应答的流程

我来描述一下从Android客户端发出一趟请求到收到应答的过程(没图,但是我会说到各种图往往笼统和忽略的部分):

1.客户端调用Volley请求函数向指定IP地址(或域名)的服务器发出一条Http请求(例如包含账号和密码的登录请求);

2.服务器容器Tomcat收到Http请求,寻找相应Java Web编写的服务器应用程序,把请求分派给它来处理;

3.Java Web编写的服务器应用程序找到处理请求相应的Servlet(Java Web项目的一部分,后面会讲)实例,把请求分配给它处理;

4.Servlet根据请求来执行相应的操作(如调用数据库然后验证登录是否成功),将结果添加到应答中,发回客户端;

5.客户端接收到应答,从应答中解析出结果(如登录是否成功),然后根据结果执行相应的逻辑(如跳转页面或提示账号密码不正确等)。


五、基础实现

实现的部分,我想分到多篇博文去讲各个部分的实现及其衔接。因此,下面用我每次测试自己APP时的流程来做个索引:

1.启动内网穿透软件——内网穿透(2017.05.12)

2.启动服务器软件和数据库软件

①服务器、数据库集成开发工具包(2017.05.13)

②MySQL数据库的建立(2017.5.18)

③Java Web的编写(2017.05.15)

④服务器端的一些测试方法(2017.05.19)

3.启动APP,开始运行——Volley请求的编写(2017.07.01)


六、进阶知识

1.JSONObject与JSONArray(2018.04.12)

2.Servlet请求调度器——DispatcherServlet(2018.04.14)

3.Q&A

  • 系统环境差异造成的异常(2018.05.14)

  • 软件版本差异造成的异常(2019.05.08)


更新日志

这篇综述和索引的博文我就写到这了,去写几个分帖了,写出来之后我会第一时间在这里挂上链接,敬请期待。
我的这套博文应该会在两周左右全部写完,如果是有紧急的问题需要帮助的朋友,直接回帖或者给我发邮件,在时间充足和我会的情况下帮你解决。
——2017.05.08

实在是有些忙,今天忙里偷闲一天,写完了内网穿透的博文,已经在上面挂上了链接。我仔细想了一下,上面第二步可能需要三篇博文分别来讲服务器、数据库集成开发工具包的介绍,Java Web的编写和Tomcat的使用,之前吹牛说两周写完可能做不到了
——2017.05.12

今早写了服务器、数据库集成开发工具包这篇文章,已经在上面挂上了链接。
——2017.05.13

今天开始写Java Web的编写,写了之后才发现,这个确实挺麻烦的,各种细节需要各种截图,已经在上面挂上了链接,没写完,可以先看看前面的准备部分。
——2017.05.15

今晚终于抽空写完了Java Web的编写, 诸君可以照葫芦画瓢,写自己的服务器程序了,博文有点长,进下心来慢慢看吧,绝对有收获!今天写着写着,又想到我好像没有规划MySQL建数据库的部分,就在索引中添上了。
——2017.05.17

今天写完了MySQL数据库的建立,已经在上面挂上了链接。
——2017.05.18

今天把Tomcat的一些使用方法写完了,写着写着突然忘了本来准备的内容了,略尴尬。
——2017.05.19

今天终于把原计划的这最后一篇文章写完了,已经在上面挂上了链接。 原本计划两周写完的,这都拖了将近一个多月了。但是最近真的很忙,没办法。

近期如果有空,我会写一篇番外文章,讲一点关于JSONObject和JSONArray的东西,应该会比较短,但是会很有用,尽请期待吧!
——2017.07.01

根据各位开发者看完这套博文之后在开发过程中的反馈,今天对《内网穿透》、《Tomcat》和《Java Web》等三帖做了一些更新。
——2018.03.11

时隔将近一年,我终于把承诺的JSONObject和JSONArray的部分写出来了,作为进阶使用的番外部分,已在上面挂上了链接。

另外,今天写的尽兴的时候,想起了Servlet分配器这个东西,作为进阶内容的话还是很有意义与价值的。这次不会再跳票那么长时间了,一两天内完成,尽情期待!
——2018.04.12

Servlet请求分派器的博文已经写完了,在上面挂上了链接。
——2018.04.14

鉴于做整体的系统测试的时候,很难定位Bug出在了客户端还是服务端,我将《Tomcat的一些使用方法》这篇博文改名为《服务器端的一些测试方法》,并在里面添加了分享3。根据分享3,大家可以先写服务端,不写客户端,服务端测试正确了再开始写客户端,这样做的好处就是,我们可以更加精准的做到Bug定位了。
——2018.05.05

今天做了一个重要的调整,即《MySQL》和《JavaWeb》两篇博文的次序,如果还是按我写它们时的顺序放在索引里,会造成你们逻辑的颠倒,因此,调了过来。
——2018.05.11

根据近期自己在开发中的亲身经历和大家的反馈,写了一篇收集由PC和真实服务器环境的差异造成的Bug的博文,不光收集问题,也写了这些问题的解决方法。 大家在服务端出现Bug的时候可以点进去看看,有可能就对号入座,解决问题了,同时也鼓励各位开发者同仁,贡献出你们在开发过程中遇到的,各种各样的问题及其解决方案。
——2018.05.14

为了便于索引和阅读,准备在所有的博文上加上目录,尤其是篇幅比较长的博文。
——2018.12.27

近期发现有不止一个人问,non-static method 'XXX' can not be referenced from a static context这个异常怎么解决,怎样把XXX函数改成静态的?这就相当过分了。我也反省了一下是不是我这个教程写得太傻瓜式操作了。最后还是觉得,好东西也要看谁拿着。我再清清楚楚地声明一下:我这篇博文不是针对一点基础知识都没有的小白的,缺什么基础知识就去学完再来搞实践!!!
——2019.04.16

今天对博文的内容和格式做了部分修改,同时根据近期开发和部署上遇到的一些问题,写了一篇新的博文用于记录软件版本差异造成的异常及其解决方案。
——2019.05.08


后记

目前,我们的网络知识体系对Android初学者实在是不太友好,首当其冲的问题就是不好查,作为初学者很难弄清针对APP的服务端和网站的服务端有多大的区别。 查到自己想要的知识相当不容易,各位大神写的也很零散。你写这一部分,他写那一部分,有的时候根本拼凑不到一起。因此,我在自己辛苦求索,花了近半个月把这一套东西弄通之后,写下了这一套博文。目的在于给和我处境类似的初学者们一些指引,让大家少走一些弯路。

如果发现了代码或者理论方面的错误,请直接回复,我会尽快修改博文,避免误导了大家。

如果在实现中出现了自己难以解决的问题,我的邮箱是[email protected]

你可能感兴趣的:(Java后端实战记录,android,服务器,经验,安卓)