赞
踩
西北农林科技大学信息工程学院
《面向对象程序设计实践》实习报告
题 目: 简易聊天软件
学 号 | |
---|---|
姓 名 | |
专业班级 | |
指导教师 | |
实践日期 | 年6月26日-7月7日 |
目 录
一、综合训练目的与要求11
二、综合训练任务11
三、总体设计11
四、详细设计说明77
五、调试与测试1616
六、实习日志1717
七、实习总结2020
八、附录:核心代码清单2020
通过本实践性教学环节,巩固学生理解和掌握面向对象程序设计的类、对象、继承、接口等主要内容。将理论与实践结合,提高学生利用面向对象程序设计思想开发程序的能力。
简易聊天软件要求:仿QQ软件,开发简洁美观的界面,实现注册、登录、查找好
友,文件传输和双人或多人聊天等基本功能。
根据题目要求和需求分析,我对简易聊天软件的总体设计如下:
图1 用例图 |
图2 类图 |
图3 活动图_注册 |
图4 活动图_登录 |
图5 活动图_查找好友 |
图6 活动图_群聊 |
图7 活动图_截图 |
图8-1 类图_Clientframe图8-2 运行结果_Clientframe登录界面界面构成头像,Logo,背景均为JLabel。UI风格为Nimbus风格(以下均同)。清除窗口装饰,并通过JLabel设计图标及其对应监听器(以下均同)。功能构成无界面拖动功能:没有窗口修饰下实现拖动(以下均同)。注册账号:新建注册界面。找回密码:新建找回密码界面。登录:客户端先判断基本的账号、密码是否输入,之后调用客户端写信息线程对服务器发送请求。 |
---|
图9-1 类图_Clientframe_register图9-2 运行结果_Clientframe_register注册账号界面界面构成提示信息、头像为JLabel,密码框与输入密码框为JPasswordField,头像选择框为JComboBox,其余输入框均为JTextField。功能构成注册:发送注册请求到服务器建立数据库数据。返回:返回登录界面。 |
图10-1 类图_Clientframe_control图10-2 运行结果_ Clientframe_control控制界面界面构成头像为JLabel,用户信息为自定义的JList,它的模型为继承AbstractListModel的ArrayList<>,它的列表项继承了JLabel和实现了ListCellRenderer,详细如图10-1类图_Clientframe_control功能构成查看好友信息:点击好友头像查看信息。刷新好友列表:直接刷新好友列表。发起群聊:发起多人聊天。添加好友:根据昵称、账号、地址等信息进行精确和模糊查找。吸附功能:类似QQ,贴近上边缘自动吸附。 |
图11-1 类图_Clientframe_add图11-2 运行结果_Clientframe_add添加好友界面界面构成提示信息为JLabel,输入框为JTextField和一个添加按钮Button功能构成精确添加好友:查找好友唯一时直接添加好友。模糊添加好友:查找好友不唯一时弹出选择框由用户选择添加好友。 |
图12-1 类图_Clientframe_chat图12-2 运行结果_Clientframe_chat聊天界面界面构成输入和输出窗口为JtextArea,发送按钮为Button,背景、截图功能为JLabel。功能构成群发信息:发送群发请求给服务器接着转发给所有客户端。截图功能:截图,并能显示截图点RGB值和截图大小,最终以当前时间命名保存桌面。 |
图13 类图_Server服务器类界面构成无界面,运行后打印。功能构成获得服务器:可以获得服务器唯一实例,一个服务器对应多客户端,保证线程安全。获得在线客户端集合:每登录一个客户端便存储在集合中,调用群发信息时使用。 |
图14 类图_ServerJDBC服务器连接数据库类界面构成无界面,供调用数据库时使用。功能构成查询功能:执行查询语句,返回ResultSet。更新功能:执行更新语句,返回影响行数。插入账号功能:根据用户输入信息插入信息到用户表,并返回生成的账号。登录验证功能:判断用户账号密码是否一致。用户头像、用户昵称、好友列表信息:返回对应查询到串值。添加朋友:插入用户间关系到好友表中。 |
图15 类图_ServerReaderThread服务器读信息进程类界面构成无界面,供客户端发送功能请求时使用。功能构成注册、登录、获取昵称、获取头像、获取好友列表、找回密码、查找好友、添加好友、群聊、退出功能:处理客户端注册等对应请求。 |
图16 类图_ServerWriterThread服务器写信息进程类界面构成无界面,供服务器读信息进程类返回处理客户端请求结果时使用。功能构成输出信息:建立线程输出信息给客户端。 |
有时为了方便申请变量的名字比较求简,这时候容易造成方法内变量覆盖类变量的情况。方法内变量覆盖类变量后一些方法的输出便变得很奇怪,这个时候并不会出现编译错误、异常等明显的错误,此时只需要使用回溯的思想,根据输出的结果一点点追究源头来发现覆盖的变量名,发现后改名即可。
为解决不知从何下手,我首先明确我的项目“简易聊天软件”的基本功能有哪些并记录纸上,同时利用知网搜索相关资料查阅类似项目概况。接着,我翻阅早已准备好的《疯狂Java讲义》,认真阅读理解此书第二章——理解面向对象,并且仔细阅读UML的相关介绍内容,大致了解了UML图的功能。
为了解UML图绘制方法,我结合此书和搜索引擎及电子书《大象Thinking in UML》,在了解和模仿的基础上不断对书上内容补充、更正,之后利用亿图图示专家进行绘制。
我先将网络编程摆在一边,将每个功能模块可能涉及的数据项写出,并初步完成表的划分。接着进行数据库连接,通过询问老师和查阅《疯狂Java讲义》,安装MySQL后,初步建表,添加JAR到程序后照着老师PPT和书上实例成功连接数据库。
冷静下来喝杯水,下位走一走,觉得今天的知识复习和储备是值得的,因为后面的大量编程将多次使用到今天所重点学习的知识。
将书上内容结合在一起,并深入理解流和网络编程的知识。接着通过搜索引擎搜索相关小论文对比代码。
询问老师,演示程序,讨论得出解决大方向。
将所遇到的问题利用搜索引擎寻找多线程的例子,模仿例子完善自我代码。
结合书上内容,设计出大概布局,然后根据想实现的功能进行搜索,看懂别人实现方法后根据我的需求进行更改。
根据需求使用搜索引擎获得的方法进行改进并解决现实问题。
根据需求使用搜索引擎得知,传输信息给服务器可以加个前缀,但最好不要使用硬编码。并在服务器接收到信息的时候判断这个信息对应的前缀要求实现怎样的功能,同时根据需求调用数据库类。
使用Array类存储匹配到多个可能好友的串,并传给输入选择框展示给用户,接着再进行一次信息发送和返回。
通过搜索引擎查找JList继承AbstractListModel类和实现ListCellRenderer 接口的范例,并通过自己的具体情况进行深化,最后实现用户列表含有用户头像、昵称和账号,并且点击后可以显示对应的信息。
查看相关功能的视频,并类似地学会思想,在服务器接收Socket的同时,以客户端name为Key,对应的Socket为value,来生成一个对应的Map集合类。
日后多找机会锻炼视频录制和剪辑的能力。
通过这次实习,我深深认识到自己的编程仅仅局限在敲代码层面上,而没有上升到更为高级更为高效的面向对象系统设计当中。因此,日后课下应多多主动去了解相关系统设计的知识中,才能在日后的大程序设计中设计出高效、系统的程序。
/*继承JLabel并实现ListCellRenderer*/
class FriendsListCellRenderer extends JLabel implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value,int index,boolean isSelected,boolean cellHasFocus){//实现接口
Friend friend = (Friend)value;//取出对象实例
String text = "<html><font size='4' face='微软雅黑'>"+friend.getName()+"<br/>"+friend.getNumber()+"</font><html/>";//设置JLable的文字
setText(text); //设置JLable的文字
Image img = friend.getPhoto().getScaledInstance(85, 85, Image.SCALE_DEFAULT);//创建图像的缩放版本,image.getImage()方法设置头像,同时设置图片
setIcon(new ImageIcon(img));//设置JLable的图片
setIconTextGap(15);//设置JLable的图片与文字之间的距离
return this;//返回自定义项目
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。