20155334课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现(二)
20155334课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现(二)
为了更好地理解本次课设,补充了这篇博客。
搭建环境本来是做了的,只是在检查前的调试过程中电脑突然黑屏,并且无法启动。后来又从同学处借来一部电脑,并在当天晚上又配置了一遍。
这篇博客主要从代码角度分析基于ARM实验箱的Android交友软件的设计与实现:
代码分为两大块,即服务器部分和客户端部分:
服务器端:
1. 服务器框架分析:
服务器由Java语言开发,主要作用是处理客户端的请求,通过解析客服端的指令来操作数据库。主要使用Socket接收客户端的数据,JDBC来操作数据库等。
服务器管理员点击启动,启动线程 ServerThread 来监听本机端口有没有网络连接,当监听到有连接时返回Socket对象,然后启动 ServerAgent 线程来解析客户端的数据。同时向 DataInputStream 数据输入流读取网络上客户端的请求,解析请求的内容,分别调用DBUtil中的静态方法来访问、操作数据库并将结果返回。然后将结果通过 DataOutputStream 数据输出流返回给网络客户端,

2. 服务器类功能介绍:
| 类 | 功能 |
|---|---|
| Chat类 | 封装了对话的编号、对话双方的ID和聊天的内容 |
| Comments类 | 封装了评论时间、内容、名称、评论者ID |
| Configuration类 | 访问配置文件database.properties,来连接Mysql数据库 |
| ConstantUtil类 | 封装了程序定义的静态常量 |
| Date类 | 封装了约会的相关信息 |
| DBUtil类 | 数据库工具类,提供一系列的静态方法实现对数据库的操作 |
| HeadInfo类 | 封装了头像的相关信息 |
| Server类 | 程序的主类,显示服务器的前端界面 |
| ServerThread类 | 处理端口的连接,来实现多台客户端登录 |
| ServerAgent类 | 读取网络数据输入源,并解析数据后操作数据库,最后将访问、操作数据库的结果返回给网络数据输出源 |
| User类 | 封装用户信息 |
3. 服务器数据库相关代码分析
配置文件database.properties:
database.driver=com.mysql.jdbc.Driver //驱动程序名
database.url=jdbc:mysql://localhost:3306/date?useUnicode=true&characterEncoding=utf-8 //URL指向要访问的数据库名
database.username=root //数据库的用户名
database.password=passwd //数据库的密码
此配置文件主要是为了数据库这个操作数据的模块具有通用性,将这些参数比如访问的数据库名称、数据库的用户名以及数据库的密码进行统一配置,以免写死在程序里,导致以后需要修改这些参数时产生不便。
- 在DBUtil.java中创建一个Configuration对象,拿到配置文件database.properties中的内容。如下代码:
Configuration rc = new Configuration("database.properties");
driver = rc.getValue("database.driver");
url = rc.getValue("database.url");
userName = rc.getValue("database.username");
passwd = rc.getValue("database.password");
- 在DBUtil.java中,使用JDBC直接访问数据库,返回Connection对象。如下代码:
Class.forName(driver); //加载驱动程序
con=DriverManager.getConnection(url,userName,passwd); //连接数据库
- 在DBUtil.java中,使用Statement来执行SQL语句。如下代码:
Statement st = con.createStatement(); //创建一个Statement对象
服务器总要连接到网络吧,最后一部分就是
4. 服务器网络相关代码分析:
Java类库中Socket类能方便的实现客户端和服务器的连接。它唯一的确定了远端主机上ip地址和端口号的组合。
服务器端通过监听某个端口是否有连接请求,同时客户端向服务器端发连接请求,服务器端向客户端返回接受消息,来建立连接。
主要过程包括:创建,连接,读写,关闭。
- 在Server.java中创建ServerSocket监听客户请求。
ss = new ServerSocket(Integer.parseInt(port.getText().trim()));
st = new ServerThread(ss);
st.start();
- 在ServerThread.java中阻塞的等待客户端的请求,建立连接后返回Socket对象。
Socket socket = ss.accept();
- 在ServerAgent.java中 ,由Socket对象创建输入流、输出流对象。
this.din = new DataInputStream(socket.getInputStream());
this.dout = new DataOutputStream(socket.getOutputStream());
- 在ServerAgent.java中,线程执行方法run()中,读、写输入输出流。
String msg = din.readUTF(); //对msg的解析,访问数据库。然后将结果写如输出流中。
dout.writeUTF(loginInfo);
5)在ServerAgent.java中,关闭输入、输出流,关闭Socket。
this.din.close();
this.dout.close();
this.socket.close();
客户端:
1. 客户端框架分析:
客户端由Android语言开发。程序中的Activity之间的跳转,实现了界面的切换。
首先,每一个Activity是实现一个特定的功能。其次是各个Activity之间的跳转。最后,每一个Activity是怎么实现其具体功能的。
首先启动软件,在进入 LoginActivity显示前启动显示欢迎界面,结束欢迎界面,然后显示登陆界面。
在登陆界面中当用户点击登陆时,首先建立网络连接并返回网络 Socket 对象。确定连接后,判断用户名和密码是否成功登陆,当网络返回登陆失败的时候,提示错误。否则启动 MainActivity 进入个人中心。
在个人中心所对应的中,总共有5种 Activity 可以被启动。分别是个人信息修改,密码修改,发布约会,附近好友,查看约会。
以个人信息修改为例介绍实现功能跳转的过程:
- 在个人中心中,点击修改个人信息进入个人信息修改界面。
- 当点击修改按钮时,首先建立网络连接,提交修改的内容并接受服务器端结果。
- 当返回成功时,再次建立网络连接。将已经修改于数据库中用户个人信息读取出,并显示在个人信息修改界面的条目中。
关于聊天功能,当点击附近好友界面和查看约会界面中的条目时,将跳转到在线聊天界面中。
聊天的内容通过访问数据库中的聊天列表获得,然后显示在聊天界面中。
2. 客户端类功能介绍:
| 类 | 功能 |
|---|---|
| WelcomeDateActivity类 | 调用其来实现欢迎界面 |
| ChatActivity类 | 用来实现聊天的功能的类 |
| ConstantUtil类 | 系统默认的常量,包括固定的服务器ip地址和固定的端口号 |
| ContactsActivity类 | 实现显示附近好友功能,包括好友的姓名,性别,头像 |
| DateListActivity类 | 显示已经发布的约会信息,包括约会类型 |
| LoginActivity类 | 实现登录功能 |
| Main类 | 版权声明 |
| MainActivity类 | 实现个人中心界面功能 |
| ModifyActivity类 | 实现用户修改个人信息 |
| MyConnecter类 | 建立网络连接类。创建网络输入、输出流 |
| PubDateActivity类 | 实现发布约会界面功能 |
| PwdModifyActivity类 | 实现在线修改登陆密码 |
| RegActivity类 | 实现在线注册功能 |
3. 界面的跳转 intent 介绍:
各个界面的跳转需要用到有个重要的“媒介”,就是 Intent ,Intent主要是解决Android应用的各项组件之间的通讯。
因此,Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
比如在本次的课设中,有如下的实例:
- 实现了个人中心活动向附近好友活动的跳转。
Intent intent = new Intent(MainActivity.this,ContactsActivity.class);
intent.putExtra("uno", uno); //传递键值对
startActivity(intent); //启动intent对象
- 实现了个人中心活动向个人信息修改活动的跳转。
Intent intent = new Intent(MainActivity.this,ModifyActivity.class);
intent.putExtra("uno", uno);
startActivity(intent);
- 实现了个人中心活动向密码修改活动的跳转。
Intent intent = new Intent(MainActivity.this,PwdModifyActivity.class);
intent.putExtra("uno", uno);
startActivity(intent);
- 实现了个人中心活动向发布约会信息活动的跳转。
Intent intent = new Intent(MainActivity.this,PubDateActivity.class);
intent.putExtra("uno", uno);
startActivity(intent);
- 实现了个人中心活动向发布约会信息活动的跳转。
Intent intent = new Intent(MainActivity.this,DateListActivity.class);
intent.putExtra("uno", uno);
startActivity(intent);
总结以及感想:
经过这几周的课程设计,让我意识到了环境的搭建固然重要,然而要想更加的理解其中的深层次的缘由,则需要对代码的熟悉和掌握。
课程设计是一个全面的考核,在它之下,暴露出了我自身的许多问题,比如对Android开发的不熟悉,对于代码的理解不到位,当然最最重要的一点是对待课设的态度。
在课设中能得到的东西是之前的学习中能以得到的,那就是自己亲自动手实践的机会。
上次的检查给了我当头棒喝,要想蒙混过关是根本不可能的,只有亲身去理解,亲自动手去做,才能将课程设计的作用发挥出来。
最后我想得到老师的原谅,因为到了最后的时刻,还是由于自身水平太差,无法实现老师的要求,但是经过这两天的琢磨还是有巨大的收获的。
我相信,有了努力就会有回报的,从长远来看,这些经历都将使我受益匪浅。
请老师指正,谢谢老师。

浙公网安备 33010602011771号