摘要
2022年考研即将开始报名,2021 年暑假的复习也是至关重要的。很多同学在暑假决定回家复习,可是回家复习的效率普遍不高,这是缺乏同学之间相互督促相互进步的结果。本项目就是为了解决这个问题,基于腾讯云的 TRTC 技术,将数据存储在 MySQL 中,通过 JavaWeb Servlet 进行用户数据的前后端交换,研发了线上考研自习室。考研的同学可以通过这个软件进入线上自习室,与房间中的其他同学一同学习、一同进步,提高考研效率。
**关键词:**自习 TRTC Servlet MySQL
完整代码:https://download.csdn.net/download/weixin_55771290/87394079
1 概述
2021年暑假即将开始了,考研的同学也在进行紧张的复习之中。很多同学选择回家复习,并且制定了严密的复习计划。可是根据我们自身体验来说,很多同学在家里面的复习效率非常低的,而且容易被其他事物干扰而中断复习。经过研究,我们发现是因为同学们在家中的环境过于安逸,并且没有学习环境,无法静下心来学习。
1.2 制作意义
因此我们设计了这样一款线上考研自习室,多个同学可以进入到一个自习室当中,相互监督、进步相互、共同学习,遇到不会的问题也可以直接向同学们提问,这样就提供了浓厚的学习氛围,提高了暑假在家的学习效率,让同学们在家中也能体验到如学校般的氛围。
1.3 人员分工
本组一共有三名成员,分别是陆健康、占钟鸣、李森。
陆健康主要负责后端 Servlet 模块、数据库连接模块以及前后端数据交互模块的设计与实现。
占钟鸣主要负责 Android 前端界面 UI 的实现、前端数据的采集以及前端的控件的相应事件函数的编写。
李森进行数据库设计和制作,UI 和整体布局设计,功能模块架构设计和部分后端连接数据库制作。
2 需求分析
2.1 业务流程与业务流程
2.1.2 业务逻辑
如图 2.1.1 所示,本项目的业务分为两个部分,分别是用户信息存储部分和进行实时音视频通话部分。
在用户存储部分中,用户可以通过 http 协议将自己的注册信息传给 Tomcat 服务器,然后再将信息存入 MySQL 服务器,当用户在登录或者修改密码时,服务器先向 MySQL 数据库请求用户信息判断是否是用户本人操作,确认本人后再完成对用户信息的操作。
在实时音视频通话部分,用户点击加入房间以后,由腾讯云服务器将房间内所有人的视频采集内容汇聚到一个页面上,房间内的所有人都可以看到房间内其他人的视频,如此就实现了音视频的实时通信。
图 2.1.1 业务逻辑图
2.1.2 业务流程
图 2.1.2 业务流程图
如图 2.2.2 所示,用户打开 App,最先展示的是登录页面,要求用户输入自己的账号密码验证身份信息,如果用户没有账号,则提示用户进入注册页面进行账号注册。用户注册完成以后自动跳转回登录页面,然后输入注册过的账密进行登录。验证成功后将进入程序主界面。
程序主界面由三个子界面构成,分别是项目信息、自习室以及我的资料。在项目信息中用户可以了解 App 的开发背景和项目介绍;在自习室界面中用户可以看到当前 App 存在的房间信息,并且可以选择房间点击进入进行实时音视频通话,同时也可以选择创建房间。创建完成后,页面会自动跳转会程序主页面。
在我的资料界面中会显示用户的相关信息,用户也可以在这个页面进行资料的修改和密码的修改,修改密码需要验证原密码以确保是本人操作。
2.2 功能性需求
- 要实现用户登录、用户注册功能,并且要对用户资料进行存储,并且提供对用户资料的修改功能。
- 要给用户提供视频通话的房间,用户可以选择自行创建房间或者加入已有房间然后与同一个房间的用户进行实时音视频通话。
- 房间内要提供关闭麦克风、关闭摄像头、切换前/后摄像头、切换扬声器
- /麦克风以及挂断功能,以实现用户在实际体验中的必要需求。
2.3 数据性需求
必须要有两张表:用户表和房间表。
- 用户表:用户表必须要有用户账号、用户密码,用来标识用户以及验证用户身份信息,必须要有电话号码和邮箱以确保能够联系上用户。
- 房间表:房间要有房间号、房间名来供用户识别,房间要有密码来保证通信的私密性,房间要有创建者(管理员)来保证能对房间内用户进行管理(踢人)。
2.4 技术可行性
在技术上,前端通过 Android 开发,在手机端显示,使用 Java 语言编写, 并且在 Android Studio 上设计 UI,后端通过 JavaWeb 的 Servlet 实现,前端将数据通过 Http 协议发送给 Servlet,Servlet 将数据通过 JDBC 发送给 MySQL 服务器,从而完成数据的交互。云服务器选择阿里云服务器,在阿里云服务器上搭建 docker,在 docker 拉取 Tomcat 容器和 MySQL 容器,将 Servlet 程序和数据库服务器部署到云端实现数据的共享。核心功能实时音视频通话通过腾讯云的 TRTC 的 SDK 实现。
以上设计的技术在大学期间或多或少都经过学习或使用过,能够在技术上进行实现。
2.5 经济可行性
本项目主要支出在于阿里云服务器和腾讯云 TRTC 通信服务的购买。
阿里云服务器标准型 ECS 服务器 540.6 元/年,腾讯云 TRTC 通信服务 4.56元/千分钟,价格低廉,在接收范围之内。
3 总体设计
3.1 系统架构设计
图 3.1 系统架构图
如图 3.1 所示,本项目一共分为三个部分,分别是云端数据库开发、安卓前端开发以及Java Servlet 后端开发。
在数据库开发中要对数据库的远程访问控制进行修改,对项目所需要的数据表进行设计与开发。
在前端开发中要对 UI 进行设计,要有注册登录界面、程序主界面、房间展示页面、房间创建页面、用户资料展示页面、用户信息修改页面以及本项目介绍的页面。同时,还要对用户在前端产生的数据进行采集,并将其通过 Http 发送给 Tomcat 服务器,然后在前端接收 Tomcat 返回的 response 信息,并且将处理后的结果展示给用户。
3.2 功能结构设计
图 3.2 功能结构图
本项目分为三个部分,分别是应用简介、通话教室以及“我的”。
应用介绍是对本项目的一些背景介绍,在用户登陆成功后会第一时间展示给用户。
通话教室会显示当前系统中所有的房间信息,用户可以选择加入房间,输入密码之后就能够进入房间,并进行音视频通信。用户也可以自己创建房间邀请自己的好友进入房间通话。
“我的”则是显示用户的数据信息,在这个模块也提供资料修改和修改密码功能。用户也可以点击退出登录以返回登录页面。
3.3 数据结构设计
图 3.3 E-R 图设计
如图 3.3 所示,本项目一共有两张数据表,一张是 Users——存储用户信息的数据表,其中存储了用户序号、用户姓名、用户密码、用户的手机号码以及邮箱信息,用户序号为自增的 INT 类型数据并作为主键,以确保不会重复。
另一张表是 Rooms——存储房间信息的数据表,其中存储房间序号、房间姓名和进入房间的密码和房价的创造者,房间序号与用户序号同理。
4 详细设计与实现
本项目我的主要工作是负责对 Servlet 模块、数据库连接模块、前后端数据库交互模块进行设计和实现。由于我的工作主要是涉及后端,因此我并没有参与本项目的界面设计。下面我将依次介绍我所实现的功能的详细设计。
4.1 Servlet 模块设计
本次项目我一共设计了八个 Servlet,分别是 FindDataServlet、LoginServlet、RegServlet 、 RoomCreateServlet 、 RoomLoginServlet 、 RoomSelectServlet 、UpdatePwdServlet、UpdateServlet,其中五个是用户相关的数据操作,三个是房间相关的数据操作,房间相关的数据操作原理与用户相关的数据操作类似,这里不做介绍,本报告仅介绍与五个用户相关的数据操作,如图 4.1 所示,本项目用到的所有 Servlet 都是一个共同的流程。
4.1.1 FindDataServlet
FindDataServlet 实现的主要功能是查询有关用户的信息,并将其显示在前端的“我的”界面。如图所示, Android 前端将当前登录的用户姓名传输到 Tomcat 服务器,Tomcat 服务器再使用 UserDao 类(Dao 类的设计会在数据库连接模块详细介绍)向 MySQL 服务器发起数据请求,获取到结果后 Tomcat 将数据返回到 Android 前端。
4.1.2 LoginServlet
LoginServlet 实现的主要功能是用户登录,前端将用户的账密传输到 Tomcat,Tomcat 使用 UserDao 查询账密是否正确,并将结果返回前端。
4.1.3 RegServlet
RegServlet 实现的主要功能是用户注册,前端将用户的注册信息传输到 Tomcat,Tomcat 使用 UserDao 对用户所给的信息进行注册,并将结果返回前端。
图 4.1 Servlet 模块流程图
4.1.4 UpdatePwdServlet
UpdatePwdServlet 实现的主要功能是修改密码,前端将用户的账号和填写的原密码和新密码传输到 Tomcat 服务器,Tomcat 调用 UserDao 类的相关函数实现
对是否修改密码的判断以及修改密码的实现。
4.1.5 UpdateServlet
UpdateServlet 实现的主要功能是修改用户资料,该功能要修改的数据不是特别重要,所以不需要对用户进行身份验证。前端将用户修改的新资料传输过来, Tomcat 再通过 UserDao 类进行修改。
4.2 数据库连接模块设计
在数据库连接模块我使用的技术是 JDBC,JDBC 的实现分为六步:注册驱动、获取连接、获取数据库对象、执行 SQL 语句、获取查询结果集、关闭资源。按照 Java 开发的设计模式,对于这种步骤繁杂的技术我进行了简化,将这些代码封装成了两个工具类:JdbcUtil 工具类和 Dao 工具类。
4.2.1 JdbcUtil 类
在 JdbcUtil 类中,我封装了注册驱动、获取连接、获取数据库对象和关闭资源模块,用户只需要调用 JdbcUtil 对应的方法即可获取这些对象,并且将数据库的相关信息(数据库账号密码、数据库的 URL)定义在 JdbcUtil 工具类中,让我在开发的过程中不用每使用一次数据库就填一次数据库的相关信息。虽然将繁杂的步骤封装起来,但是简化之后的使用过程还是太长了,因此我对用户执行的 SQL 行为进行了封装,定义了 Dao 类,Dao 类中定义的是开发者可能会对数据库进行的增删改查的操作。这样,在开发过程中,开发者只需要调用 Dao 类的对应增删改查函数就能够实现相应的功能,而不用取管 JDBC 的过程是如何实现的,极大的加快了开发速度。
4.2.2 Dao 类
下图中的 UserDao 类定义了一些数据库操作函数,分别对应的是我们应用需要功能。其中 update 是重载函数,根据所传参数的不同来实现对应的功能。
如用户登录 login、修改资料 update、用户注册 add 等我们之前所用到的功能都能够在 UserDao 中实现。RoomDao 类同理,在 RoomDao 类中定义了房间注册的 add 函数、房间登录的 login 函数以及查询所有房间的 findAll 函数。
4.3 前后端数据交互模块设计
图 4.3 前后端数据交互图
后端处理数据我在前面已经说得很清楚了,这里主要说一下 Android 端的数据交互模块,如图 4.3 所示,在 Android 端我定义了一个 WebServiceGet 类,用来使用 http 协议通过 get 方式来将前端数据发送给后端并接收返回的数据信息。
在 WebServiceGet 中我定义了一个方法是 executeHttpGet(String path),返回值类型是 String,在本项目中,每次在调用这个方法之前我都先将 path 配置好, 将要传输的数据拼接到 path 中,然后使用 get 方式传输给 Tomcat 服务器,Tomcat 服务器也能通过 getParameter 方法读出前端传来的数据。Tomcat 向前端发送数据是通过 PrintWriter.out(result)来发送数据,如果收到 Tomcat 的状态码是 200,即可在前端接收 Tomcat 发来的数据,上述过程就是前端与 Tomcat 后端的数据交互过程。
需要注意的是,在 Android 开发中,对应 Http 的操作不能在主线程中完成, 所以我定义了一个 MyThread 类来开辟子线程,当调用 WebServiceGet 类的方法时就开辟子线程使其在子线程中执行。
5 总结
5.1 总结收获
之前在做物联网综合实践的时候,我选题是军事五项成绩管理系统,开发手段也是 App 开发。之前的开发手段非常稚嫩,比如手机直连 JDBC,还有对 JDBC 只是简单的封装了 JdbcUtil 类,没有对 Dao 类进行封装,导致程序臃肿不堪,每次对数据进行操作都要写一大段的代码。而且 Android 端直连 MySQL 数据库的安全性非常之低,几乎是属于全暴露的状态,对于这个我也一直耿耿于怀。
终于在这次开发中,我没有直连数据库,而是使用 Servlet 进行了一个中转操作,使得数据传输更加安全。并且我对 Dao 类进行了封装,当进行数据库的数据操作的时候能够很直观的体现 Dao 类所带来的便捷性——只需要调用一个函数,只需要一条 Java 语句,就能够及时获取我要的结果。并且这个 Dao 类是我自己写的,这令我十分有成就感。
在本次项目中,我还亲自在云端上部署了 Tomcat 服务器,并上传了 war 包使其运行,然后通过 Android 端来访问服务器,这种数据交换的过程让我感到又“神奇”而又“兴奋”。神奇是因为数据传输竟然需要这么多的步骤,兴奋是因为数据传输过程都是由我亲自编写,服务器由我亲自部署完成的,这使我有一股强烈的自豪感。
5.2 课程建议
在本学期的移动应用平台开发课程中,陈老师以他丰富的职业生涯和人生阅历将目前行业内都在使用的技术和开发手段进行了简单的讲解,极大的丰富了我对于软件开发的认识,也使我的开发思想变得更加开阔。
但是这个是优点也是缺点,同学们选这门课的目的也是抱着学习 Android 开发技术的目的来学的,而陈老师本学期只有在第一节课稍微讲了一下 activity 和 layout 布局,其他的课时均在进行课程知识的拓展。我这学期也是通过网上视频自学学习的 Android 开发,学习效果不是特别显著,感觉只是学习了一些皮毛。希望陈老师在课上能够少一点课外知识,多讲解一下 Android 开发相关的识。