当前位置:首页 >> 电脑基础知识 >>

基于JAVA语言的网络聊天系统开发与实现(含源文件)


目录
摘要 ............................................................................... II Abstract ........................................................................... II 1 软件介绍 .......................................................................... 3 1.1 背景 ........................................................................ 3 1.2 目的 ........................................................................ 3 2 开发技术 .......................................................................... 3 2.1 界面层技术 .................................................................. 3 2.2 通信层技术 .................................................................. 3 2.3 数据层技术 .................................................................. 3 3 开发环境 .......................................................................... 4 3.1 硬件环境 .................................................................... 4 3.2 软件环境 .................................................................... 4 4 需求分析 .......................................................................... 4 4.1 客户端需求分析 .............................................................. 4 4.2 服务器需求分析 .............................................................. 4 4.3 数据层需求分析 .............................................................. 4 5 系统架构 .......................................................................... 5 6 设计实现 .......................................................................... 5 6.1 消息封装类 Message ........................................................... 5 6.2 服务器 ...................................................................... 6 6.2.1 主服务器 Server ........................................................ 6 6.2.2 虚拟服务器 VirtualServer ............................................... 6 6.2.3 登录验证 Logon ......................................................... 7 6.2.4 Hibernate 配置文件 ..................................................... 8 6.2.5 Hibernate 会话工厂 ..................................................... 8 6.2.6 数据操作类 UserDao ..................................................... 9 6.2.7 数据操作类 CrowdDao .................................................. 10 6.2.8 表结构设计 ........................................................... 10 6.2.9 用户类 User ........................................................... 11 6.2.10 群组类 Crowd ......................................................... 11 6.3 客户端 ..................................................................... 11 6.3.1 Client ............................................................... 11 6.3.2 登录界面 Logon ........................................................ 13 6.3.3 好友界面 Friend ....................................................... 14 6.3.4 聊天界面 Chart ........................................................ 15 6.3.5 游戏界面 Game ......................................................... 16 6.3.6 游戏规则 ............................................................. 17 6.3.7 算法思路 ............................................................. 17 7 测试说明 .......................................................................... 18 总结感想 ........................................................................... 19 参考文献 ........................................................................... 20 致谢 ............................................................................... 20
I

基于 JAVA 语言的网络聊天软件
摘要
本聊天软件是使用 Java 编程语言来完成开发的。在软件的开发过程中,使用 Socket 来进行网络 通信,使用 Swing 来绘制界面,使用开源的对象关系映射框架 Hibernate 来进行数据访问。其中 Hibernate 能够使程序员以面向对象的思维来处理关系型数据。本聊天软件不仅支持聊天,还加入了 “连连看”游戏。该游戏让人们之间的交流得到延伸,让彼此之间的关系更进一步。本聊天软件主 要有以下三个功能:一、登录验证;二、聊天通信;三、游戏互动。

关键词
聊天;Java;Swing;套接字;Hibernate

NetworkChatSoftwareBasedonJAVALanguage
Abstract
ThischatsoftwarewasdevelopedbyusingtheJavaprogramminglanguagetocomplete. Intheprocessofsoftwaredevelopment,Socket is used for network communication, Swing is used to draw the interface, object relational mapping framework Hibernate open source is used for data access.Hibernateallowsprogrammerstodealwithrelationaldatainobject-orientedthinking. Thischatsoftwarenotonlysupportchatatthesametime, alsojoinedthe "LinkUpFree" game. Thegameallowscommunicationbetweenpeoplehasbeenextended, sothattherelationshipbetweeneachothermore.Thissoftwaremainlyhasthefollowingthreefunctions: First, landingvalidation; Second, chatcommunications; Three, theinteractionofthegame.

Keywords
Chat; Java; Socket; Swing; Hibernate

II

商丘师范学院 2015 届本科毕业论文(设计)

1 软件介绍
1.1 背景
在当今世界,人们的追求早已不局限于物质生活,而更多的是渴望在精神领域上得到满足,这 突出表现在我们的人际交往上。人们渴望与远在天涯又或是近在咫尺的亲朋好友无拘无束地沟通, 而此时此刻一款即时通讯工具对于我们来说,它的重要性不言而喻! 在计算机网络愈来愈普及的今天,人们对于网络的依赖也愈来愈大,类似于 QQ、MSN 等聊天 工具早已融入到我们日常生活中,为我们的生活带来了欢乐和便利。因此,我力图开发一个在线的 即时聊天软件以满足我们在日常生活中交流的需要,为我们的生活增光涂色。

1.2 目的
本聊天软件以通信为其核心,同时融入了娱乐的元素,一款十分经典的“连连看”游戏。让我 们在聊天的同时还能与好友一起通过游戏来增进彼此的感情,让彼此的心更加靠近,让我们的生活 从此不再单调。 本聊天软件是在 Windows 环境下进行开发的。 通过 Swing 实现操作界面的设计, 使用 Java 语言 中的 Socket (套接字) 来实现网络之间的通信, 使用 Hibernate 框架来进行数据的增删改查, 而 MySQL 数据库则用于数据的存储与管理。在开发的过程中综合运用自己所学到的各种技术,一方面强化我 在学校里学到的知识与专业技能,另一方面也使得我更好地去理解有关软件开发的流程与思想。这 些能力与经验都将为我后续的学习和工作打下坚实牢固的基础,不断地提升个人的职业素养。 同时,本聊天软件将不断与信息领域的系统相互集成和渗透,向校园、集团等群体进行拓展, 应用将突破个体,并应用于远程教学、远程演示、网络会议等。以丰富的接入方式,以保质保量的 服务,以友好的用户体验呈现在世人面前。并且不断地扩大功能与应用范围,满足未来时代的话音。

2 开发技术
本聊天软件用到的技术涉及到 3 个层面,它们分别是:界面层、通信层、数据持久化层。

2.1 界面层技术
使用 Java 中的 Swing 来进行操作界面的开发。Swing 是一款功能强大,使用方便,跨平台的图 形界面开发工具包,专门用于开发 Java 应用程序的用户界面。Swing 允许您设定自己喜爱的界面风 格,它可以是跨平台的 Java 风格,也可以是我们熟悉的 Window 风格,这一点是其他界面开发工具 很难比拟的。

2.2 通信层技术
利用 java 中的 Socket(套接字)来完成客户端与服务器的交互。 该 Socket 是基于 TCP/IP 通信协议 的数据传输对象,它提供了安全可靠的通信机制。在服务器使用 ServerSocket 创建监听端口,而在 客户端则使用 Socket 来连接服务器。 在连接成功时, 应用程序的客户端和服务器都将产生一个 Socket 实例,本聊天程序就是通过利用这个 Socket 实例来实现两段的通信和其他功能。在通信的过程中我 也使用了多线程编程技术以实现复杂的交互行为。尤其是在服务器端,服务器每接收一个客户端就 会产生一个虚拟服务器来单独为其服务。通过该技术的运用使得本聊天软件可以允许多人同时在线 与自己的好友畅怀的交流。

2.3 数据层技术
考虑到现如今框架技术的兴起,在数据层的处理上我也使用了开源的对象关系映射框架 Hibernate。它对 Java 的数据库连接(JDBC)进行了非常轻量级的对象封装,使得 Java 程序员可以 随心所欲的使用面向对象编程思维来操纵数据库。 本聊天软件使用 MySQL 作为数据持久化存的储器。MySQL 是一个真正的多用户、多线程数据
3

商丘师范学院 2015 届本科毕业论文(设计)

库服务器,是以客户端/服务器架构实现的,它由一个服务器守护线程和很多不同的客户程序和库组 成。MySQL 是一种关系型数据库管理系统,通过表来管理数据,增加了处理数据的速度并提高了操 作的灵活性。Hibernate+MySQL 的组合在数据的处理上让我变得得心应手,同时也让这个程序变得 更加强壮与稳健。

3 开发环境
3.1 硬件环境
硬件配置:AMDX64 兼容桌面平台。

3.2 软件环境
操作系统:Windows8.1 企业版。 JDK 版本:JDK_8。 数据库:MySQLServer5.6。 开发工具:MyEclipse2015。 第三方工具包:Hibernate。

4 需求分析
本聊天软件是在 C/S 模式下完成开发的,整个系统分为两个重要的组成部分:客户端、服务器。 在客户端用户可以通过登录模块进行登录操作,登录成功的用户则进入到好友列表界面;选中 指定的好友,就可以发起与该好友的会话,通过聊天模块与好友相互嘘寒问暖;在聊天模块中,既 可以发送消息,同时也可以发起与该好友的游戏互动,在 PK 中一决雌雄。 在服务器,服务器要为每个用户进行服务,对用户登录信息进行验证,接受来自用户的消息请 求并按照消息的类型进行各种不同的操作和处理。

4.1 客户端需求分析
客户端实现的功能主要有: 1.登录模块:用户在登录界面中输入个人身份信息,由客户端将信息传递至服务器进行用户合 法性的验证,验证成功,则跳转到聊天模块,否则给出相关提示。 2.好友模块:显示好友列表,通过该模块可以发起与好友的会话或者游戏。 3.聊天模块:能够及时的发送用户的文本消息,同时能够即时地将好友发过来的消息展现出来。 4.游戏模块:开启两个好友之间的游戏互动。 5.界面效果:布局整洁、大方;色彩光鲜、夺目;操作简单、舒适。

4.2 服务器需求分析
服务器作为后台程序,实现的功能主要有: 1.能够接收每个客户端的通信连接。 2.调用数据访问层来验证用户的个人信息。 3.能够及时接受用户的聊天消息并进行消息的转发。

4.3 数据层需求分析
数据层实现的功能主要有:响应来自服务器的数据访问请求。

4

商丘师范学院 2015 届本科毕业论文(设计)

5 系统架构
本系统以客户端、服务器以及数据库三维一体构建起了系统的整个架构。

图 5-1 系统架构

客户端:用户在客户端的所有操作都依赖于客户端的守护线程 Client 来完成,该线程负责与服 务器进行数据交互。当用户需要登录时,由登录模块调用 Client 向服务器发送身份验证请求。服务 器接收到该验证请求之后便进行验证处理并返回验证结果给 Client。 如果 Client 判定验证成功则从验 证结果中提取出个人信息并开启好友模块;当用户在好友模块中打开了一个聊天模块后,便可以调 用 Client 来进行聊天消息的传递;如果打开的是游戏模块,则先完成游戏的一方调用 Client 向另一 方发送获胜消息,并终止另一方的游戏。 服务器:服务器分为主服务器与虚拟服务器。主服务器 Server 作为服务器的守护线程,主要负 责接收客户端的连接,在服务器接收到一个客户端后,就开启一个虚拟服务器 VirtualServer 来为该 用户服务;虚拟服务器通过调用底层的登录模块等来为用户提供登录验证等服务。 本架构中,借用了 Spring 中的分层思想,这也是在软件项目开发过程中经常采用的方案。将操 作或功能分为不同的层次,各层次之间想对独立,高层调用底层的功能,低层为高层提供服务。一 方面,可以将同种类型的操作放在一起集中管理。另一方面,将操作提取出来,提高了代码的复用 性和程序的扩展性。分层使得程序流程变得清晰明了,而且维护成本相对低廉[1]。

6 设计实现
6.1 消息封装类 Message
Socket:套接字,在本聊天软件中作为客户端与服务器之间通信载体,为系统的交互提供支撑。 为了方便开发,我将客户端与服务器之间传送的消息封装成一个消息对象类Message.。继而使用从 Socket获取的对象输入流、对象输出流来收发消息对象[2]。 封装的消息类代码如下所示: //消息封装类实现了序列化接口 publicclassMessageimplementsSerializable{ privatestaticfinallongserialVersionUID = -2842889997276284663L; privateIntegertype;//消息的类型
5

商丘师范学院 2015 届本科毕业论文(设计)

privateDatesenDate= newDate();//消息创建的时间 privateUsersender;//消息的发送者 privateUseraccepter;//消息的接收者 privateStringcontent;//消息的内容 } 其中,消息的类型在服务器和客户端都遵循着统一的标准。这样的话,客户端发给服务器什么 样的消息,服务器在解析出消息的类型之后,就可以进行相应的操作了。为了实现消息载体以对象 的形式在网络间进行传递,该消息类必须实现 Java 中的序列化接口,这一点是其他通过字节流或者 字符流传递消息所不同的。

6.2 服务器
6.2.1 主服务器 Server 主服务器主要充当一个前置服务,用来接收客户端的连接。在获得一个客户端的连接后就会产 生一个虚拟服务器,并将该连接委托给虚拟服务器让它来为用户提供服务。同时主服务器也维护着 所有的虚拟服务器,它扮演着一个管理者的角色[3]。 //服务器维护的虚拟服务器列表,一个 Map 集合,通过<用户的账号:为该用户服务的虚拟服务 器>这种键值对的对应关系来管理虚拟服务器。 privatestaticHashMap<Integer, VirtualServer>usersOL = newHashMap<Integer, VirtualServer>(); try { serverSocket = newServerSocket(port); //这里通过无限循环,来不停地接受用户的连接。 while(true) { clientSocket = serverSocket.accept();//接收客户端的连接 newThread(newVirtualServer(clientSocket)).start();//开启虚拟服务器来为其服务 } } catch (IOExceptione) {//异常处理 } 6.2.2 虚拟服务器 VirtualServer 虚拟服务器才是真正的服务载体,当它接收从主服务器哪里得到的来自客户端的连接后,便可 进行一对一的服务。所有的消息都经过它来处理。当虚拟服务器之间需要交互时,虚拟服务器可以 从主服务器那里拿到主服务器所维护的虚拟服务器列表。并从中根据键值对来获取指定的虚拟服务 器,然后再进行后续的操作。 该类实现了 Runnable 接口,该接口是将线程所运行的程序代码提取出来封装成为一个对象。 Runnable 对象可以用来创建线程。 privateUseruser = null;//虚拟服务器所服务的用户 @Override publicvoidrun() { Booleanb = true;//线程结束控制符 //接收来自客户端封装的消息对象 Messagemsg = null; while(b) { try { msg = (Message)input.readObject();//客户端Client发送过来的消息对象 //根据消息的类型进行不同的处理 if(msg.getType() == 10) {//登录验证操作
6

商丘师范学院 2015 届本科毕业论文(设计)

MessagereturnMsg = newLogin().validate(msg.getSender());//登录验证 if(returnMsg.getType() == 13) { //验证成功,则将该虚拟服务器添加到主服务器管理的虚拟服务器列表 Server.getUsersOL().put(returnMsg.getAccepter().getAccount(), this); } send(returnMsg); }elseif(msg.getType() == 20) {//转发聊天消息 Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg); send(msg); }elseif(msg.getType() == 30) {//退出操作 Server.getUsersOL().remove(user.getAccount()); Thread.currentThread().interrupt();//结束当前线程 }elseif(msg.getType() == 40) {//邀请好友进行游戏 Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg); }elseif(msg.getType() == 41) {//好友同意游戏邀请,双方开始游戏 Messagem = newMessage(); m.setType(42);m.setAccepter(msg.getAccepter()); Server.getUsersOL().get(msg.getAccepter().getAccount()).send(m); m.setAccepter(msg.getSender()); send(m); }elseif(msg.getType() == 43) {//拒绝好友的游戏邀请 Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg); }elseif(msg.getType() == 44) {//由获胜方通知失败方,胜负情况 Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg); } } catch (Exceptione){//异常处理 b = false;//如果出现异常则修改线程终止符,使线程结束。 } } } 从源码中可以看出,虚拟服务器主要的工作,就是解析消息的类型,并根据消息的类型进行相 应的处理。 例如在消息的类型为 10 时, 虚拟服务器就调用登录验证 Logon 来对用户的信息进行验证, 根据登录验证的验证结果,再返回相应的消息给客户端的 Client。 6.2.3 登录验证 Logon privatestaticUserDaouserDao = newUserDao();//调用底层的用户数据访问功能 publicMessagevalidate(Useruser) { Messagemsg = newMessage();//返回验证的结果信息 Useru = userDao.findByAccount(user.getAccount());//账户存在 if(u == null) {//账户不存在 msg.setType(11);msg.setContent("账户不存在!"); }else{//该账户存在 u = userDao.findByAccountAndPassword(user.getAccount(), user.getPassword()); if(u == null){//密码不对 msg.setType(12);msg.setContent("密码不对!");
7

商丘师范学院 2015 届本科毕业论文(设计)

}else{//账户、密码正确 if(Server.getUsersOL().get(user.getAccount()) == null) {//可以登陆 msg.setType(13);msg.setAccepter(u); }else{//已登录 msg.setType(14);msg.setContent("不能重复登录!"); } } } returnmsg; }} 登录验证,主要分为三步: 1.首先验证用户的账号合法性,即该账号是否存在。只有账号存在才会进行后续的验证。 2.如果用户的账号存在,再验证密码是否与账号匹配,如果匹配成功,则返回该用户的信息。 3.接下来则从主服务那里去判定该用户是否已经登录,对于已登录的用户则不再给予登录操作。 6.2.4Hibernate 配置文件 访问数据的操作要借助 Hibernate 框架来完成。 使用了 Hibernate, 我们就可以不用再写很复杂繁 琐的 JDBC 语句去建立与数据库的连接, 而将这些操作全都交给 Hibernate 来完成。Hibernate 的配置 文件如下: <session-factory> <!—在控制台打印出执行数据访问的SQL语句 --> <propertyname="show_sql">true</property> <!—连接数据库所使用的驱动程序 --> <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接数据库的地址 --> <propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/NFC</property> <propertyname="hibernate.connection.username">root</property> <propertyname="hibernate.connection.password">846255</property> <!-- 数据库的方言,该方言用于对数据库的操作进行解释 --> <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!—开启数据库定义语言,用于自动创建表结构--> <propertyname="hibernate.hbm2ddl.auto">create</property> <!-- 映射的实体类 --> <mappingclass = "cn.newcapec.model.Crowd"/> <mappingclass = "cn.newcapec.model.User"/> </session-factory></hibernate-configuration> 6.2.5Hibernate 会话工厂 在完成了配置之后,为了可以使用它来进行数据的操作,我们需要先创建会话工厂,因为数据 的操作是基于会话的。会话工厂的代码如下: publicclassHibernate { privatestaticSessionFactorysf = null;//会话工厂 privatestaticSessionsession = null; static { Configurationcf = newConfiguration(); cf.configure();//在默认路径下,读取配置文件。
8

商丘师范学院 2015 届本科毕业论文(设计)

ServiceRegistrysr = newStandardServiceRegistryBuilder().applySettings(cf.getProperties()).build(); sf = cf.buildSessionFactory(sr); session = sf.openSession(); } privateHibernate() {} publicstaticSessionFactorygetSessionFactory() {return sf;} publicstaticSessiongetSession() {return session;} } 这里的会话工厂 SessionFactory 使用的是 Java 设计模式中的单例模式, 唯一的 SessionFactory 对 象能够保证数据操作的可控性,让我们能够利用事务有效的保证被操作数据的一致性。 在配置文件中罗列出了所使用的实体类,通过在实体类中使用相应的注解标明,Hibernate 就可 以将一个实体类映射为一张表,而实体类的属性则将映射为表中的字段。实体类就相当于一张表, 为了操纵它,我为实体类分别写了一个操作类。利用会话 Session 来实现数据的增删改查。 6.2.6 数据操作类 UserDao publicclassUserDao { privateSessionsession = null; publicUserDao() {session = Hibernate.getSession();}//获取会话 publicUserfindByAccount(Integeraccount) {//根据账号来查询用户 Criteriac = session.createCriteria(User.class); c.add(Restrictions.eq("account", account)); Useruser = (User)c.uniqueResult(); returnuser; } //根据账号和密码来查询用户 publicUserfindByAccountAndPassword(Integeraccount, Stringpassword) { Criteriac = session.createCriteria(User.class); c.add(Restrictions.eq("account", account)); c.add(Restrictions.eq("password", password)); Useruser = (User)c.uniqueResult(); returnuser; } //查询全部用户 publicList<User>queryAll() { Criteriac = session.createCriteria(User.class); @SuppressWarnings("unchecked") List<User>users = c.list(); returnusers; } }

9

商丘师范学院 2015 届本科毕业论文(设计)

6.2.7 数据操作类 CrowdDao publicclassCrowdDao {//群组数据访问层 privateSessionsession = null; publicCrowdDao() {session = Hibernate.getSession();} publicvoidsave(Crowdcrowd) {//保存群组 Transactiontransaction = session.beginTransaction(); session.save(crowd); transaction.commit(); } publicvoidupdate(Crowdcrowd) {//更新群组 Transactiontransaction = session.beginTransaction(); session.update(crowd); transaction.commit(); } publicvoiddelete(Crowdcrowd) {//删除群组 Transactiontransaction = session.beginTransaction(); session.delete(crowd); transaction.commit(); } } 以上两个数据访问类都使用了基于 Criteria 的查询方式,该方式是面向对象的,通过为该对象设 置一些相应的属性值,就可以获取满足条件的数据。如:c.add(Restrictions..eq("account", account))等 价于 whereaccount = account.从思想的层面上来讲很大程度上有别于传统的 SQL 查询方式。 Hibernate 还提供了封装过的 save(Object);update(Object);delete(Object)等方法供我们使用,以便提高开发效率。 通过如此简单而又精炼的代码即可完成对数据的处理,极大地解放了程序员的劳动力。 6.2.8 表结构设计
表 6-1User 实体类对应的表

字段 account password name id

数据类型 Int varchar varchar Int
表 6-2Crowd 实体类对应的表

备注 账号 密码 昵称 主键

字段 name id

数据类型 varchar Int

备注 群组名称 主键

关于用户的信息主要有两张表。一张是用户自身的信息表,该表用来存储用户的个人资料;另 一张表是群组表,用来记录每个用户所拥有的群组信息。每个用户可以拥有多个群组(如:朋友、 陌生人等) ,而每个群组又可以拥有多名用户(如:朋友列表下有张三、李四两个人) 。两张表是多 [4] 对多关系 。

10

商丘师范学院 2015 届本科毕业论文(设计)

需要指明的是,在这两张表里面都没有通过外键来建立关联关系,这是因为可以通过 Hibernate 的注解@ManyToMany 来完成关联关系的映射。Hibernate 在处理这个注解时,自动地去帮我们创建 一张中间表,并用它来维护表之间的关联关系,这使得我们在构建表结构的时候变得异常轻松。 6.2.9 用户类 User @Entity@Table(name = "User") publicclassUserimplementsSerializable { privatestaticfinallongserialVersionUID = 1L; @Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", unique = true) privateIntegerid;//主键 @Column(name = "account") privateIntegeraccount;//账号 @Column(name = "password") privateStringpassword;//密码 @Column(name = "name") privateStringname;//昵称 @ManyToMany(mappedBy = "users", fetch = FetchType.EAGER) privateList<Crowd>crowds = newArrayList<Crowd>();//用户所属的群组 … } 6.2.10 群组类 Crowd @Entity@Table(name = "Crowd") publicclassCrowdimplementsSerializable{ privatestaticfinallongserialVersionUID = 1L; @Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id") privateIntegerid;//主键 @Column(name = "name") privateStringname;//群组的名称 @ManyToMany(fetch = FetchType.EAGER)//(mappedBy = "crowds") privateList<User>users = newArrayList<User>();//群组所包含的用户 publicCrowd() {} } 1.通过@Entry 来标明它是一个实体类。 2.通过@Tabel(name=”tableName”)来指明该实体类与数据库中哪一张表相对应。 3.通过@Id 来指明表中的主键。 4.通过@GeneratedValue(strategy = GenerationType.AUTO)来指明主键的增长策略。 5.通过@Column(name = "name")来指明类中的某个属性与数据库表中哪个字段名相匹配。 6.通过@ManyToMany(fetch = FetchType.EAGER)来指明两个实体类之间的多对多关系。 使用了 Hibernate 之后,作为程序员的我们完全可以使用面向对象的思维来处理数据。尤其是在 Hibernate 的 配 置 文 件 中 使 用 了 <propertyname="hibernate.hbm2ddl.auto">create</property> 之 后 , Hibernamte 甚至能够自动帮我们依据实体类来创建相应的表结构, 我们无需再为操作数据库而苦恼。

6.3 客户端
6.3.1Client 对于客户端所有的通信操作都是基于该 Client 来完成,它是客户端的守护线程 publicUseruser = null;//Client所服务的用户
11

商丘师范学院 2015 届本科毕业论文(设计)

privateMap<Integer, Chart>map = newHashMap<Integer, Chart>();//用户的聊天窗体Map @Override publicvoidrun() { while(true) { try { Messagemsg = (Message)input.readObject(); if(msg.getType() == 11) {//账户不存在 Logon.getInstance().setInfo(msg.getContent()); }elseif(msg.getType() == 12) {//密码不对 Logon.getInstance().setInfo(msg.getContent()); }elseif(msg.getType() == 13){//可以登陆 Useruser = msg.getAccepter(); setUser(user); Logon.getInstance().setVisible(false);; Friend.getInstance().setName(user.getName()); }elseif(msg.getType() == 14) {//已登录 Logon.getInstance().setInfo(msg.getContent()); }elseif(msg.getType() == 20) {//转发聊天消息 this.getMap().get(msg.getSender().getAccount()).append(msg); }elseif(msg.getType() == 40) {//收到来自好友的游戏邀请 Friend.getInstance().requestGame(msg.getSender()); }elseif(msg.getType() == 42) {//好友同意开始游戏 Friend.getInstance().startGame(msg.getAccepter()); }elseif(msg.getType() == 43) {//好友拒绝来游戏邀请 Friend.getInstance().refuseGame(msg.getSender()); }elseif(msg.getType() == 44) {//胜负已分,游戏中止 //Game.getInstance().loseGame(); } } catch (Exceptione) {//异常处理 } } } 这个位于客户端的后台守护线程,接收服务器推送过来的消息。类似于虚拟服务器它也根据消 息的类型,对消息进行分类处理,同时也将用户的操作封装成消息对象传递给虚拟服务器。 当一个用户与多个好友进行会话时, 为了方便管理与每个好友的会话, 在该类中使用了一个 map 集合。当该类收到来自某个好友的聊天消息,在提取出消息内容后,从 map 中根据键值对<好友的 账号:与好友聊天的窗体>来得到指定好友的聊天窗体,将聊天数据交给该聊天窗体进行显示。该类 只是负责对数据进行收发,而数据的显示等操作,则交给上层的界面来完成。彼此各司其职,这样 就实现了分层的效果。

12

商丘师范学院 2015 届本科毕业论文(设计)

6.3.2 登录界面 Logon

图 6-1 登录界面

//登录界面所用到的控件 privatestaticLogonlogon = newLogon();//窗体本身 privateJPanelhead = newJPanel();//头部 privateJLabelmin = newJLabel(newImageIcon("image/min.png"));//最小化 privateJLabelclose = newJLabel(newImageIcon("image/close.png"));//关闭 privateJPanelbody = newJPanel();//身体 privateJLabelinfo = newJLabel();//信息提示 privateJLabelaccountLabel = newJLabel("账号:");//账号标签 privateJLabelpasswordLabel = newJLabel("密码:");//密码标签 privateJTextFieldaccount = newJTextField();//账号文本框 privateJPasswordFieldpassword = newJPasswordField();//密码文本框 privateJButtonlogin = newJButton("登录");//登录按钮 privateJPanelfoot = newJPanel();//尾部 privateJLabelset =newJLabel(newImageIcon("image/set.png"));//设置 登录界面使用来Swing的网格包布局GridBagLayout来放置各个组件在面板JPanel中的位置。

13

商丘师范学院 2015 届本科毕业论文(设计)

6.3.3 好友界面 Friend

图 6-2 好友界面

//省略了与登录界面外层布局的内容 privateJPanelbody = newJPanel();//身体 privateJPanelshow = newJPanel();//用户信息展示 privateJLabelimg = newJLabel(newImageIcon("image/me.png"));//用户照片 privateJPanelinfo = newJPanel();//用户的昵称、等级 privateJLabelname = newJLabel();//用户昵称 privateJLabellevel = newJLabel();//用户等级 privateJScrollPanejsp = null;//容纳好友列表的窗体 privateJTreetree = null;//用户的好友列表 在好友界面中,通过遍历 Client 传过来的用户信息 User 中的 List<Crowd>来构建好友列表树 JTree,这里使用了边界布局的方式来放置组件。

14

商丘师范学院 2015 届本科毕业论文(设计)

6.3.4 聊天界面 Chart

图 6-3 聊天界面

privateJPanelbody = newJPanel();//身体 privateJTextAreaoutput = newJTextArea();//显示框 privateJScrollPaneread = newJScrollPane(output);//显示框的滚动窗体 privateJTextAreainput = newJTextArea();//输入框 privateJScrollPanewrite = newJScrollPane(input);//输入框的滚动窗体 privateJPaneljp = newJPanel();//输入框的滚动窗体 privateJButtonenter = newJButton(" 发送 ");//发送按钮 privateJButtoncancel = newJButton(" 取消 ");//取消按钮 privateUserfriend = null;//聊天的好友 聊天界面中利用 JTextArea 来显示聊天对话的内容, 当聊天内容过多时, 可以拖动外层滚动面板 JScrollPane 提供的滚动条来翻阅查看。

15

商丘师范学院 2015 届本科毕业论文(设计)

6.3.5 游戏界面 Game

图 6-4 游戏界面

在游戏界面,产生 8*8=64 个网格,所以需要 32 对按钮,其中每一对中的两个按钮都是一样的。 这样就可以保证所有的按钮都会有一个与之匹配。因为在该网格中无法按位置来获取其中的按钮, 所以我使用了一个二维数组来模拟网格的位置。 “连连看”游戏的界面代码如下: publicclassGameextendsJFrame{ privatestaticfinallongserialVersionUID = 1L; JMenuBarjmb = null;//菜单栏 JMenufile = null;//文件菜单 JMenucustomize =null;//自定义菜单 JMenuItemdifficulty = null;//自定义难度 JMenuItemcontent =null;//自定义内容 JMenuItemclose = null; //关闭 JMenustart = null;//开始游戏 JMenunewGame = null;//新游戏 JMenuinfo = null;//信息 JPanelgamespace = null;//游戏场所 JButtonjb = null;//随机按钮 JButtonfirst = null;//第一次点击的按钮 JButtonsecond = null;//第二次点击的按钮 ArrayList<JButton>al = null;//按钮集合,用于帮助产生随机按钮 Randomr = newRandom();//随机体 intcount = 64; //剩余按钮计数器 JButton[][] jbMap = null;//按钮二维数组,用于记录按钮的状态和生成映射地图
16

商丘师范学院 2015 届本科毕业论文(设计)

JButton[][] backUp = null; Finderf = null;//查找器,用于查找制定按钮的位置。 Userfriend = null; 6.3.6 游戏规则 分析连连看游戏可知: 1.只有内容相同的按钮连在一起才可以消除掉,而且连线之间不能有障碍物。 2.所有按钮都是成对出现的。 3.从一个按钮到达另一个按钮最多能走三条直线。如果需要走三条线的话,那么第二条直线必 须到达另一个按钮所在的行或者列,只有这样才有可能在第三条直线到达需要连接的按钮。 6.3.7 算法思路 这里使用了最长路线算法:最多需要三步才能到达指定按钮。 首先, 从一个按钮出发, 有东南西北四个方向可以走, 此为第一条直线。 然后, 设置标记 progress, 在第一条线的基础上,又可以向左右两个方向前行,此为第二条直线。再然后,设置标记 climax, 在第二条线的基础上,又可以向左右两个方向前行,此为第三条直线。 每走一步之前需要先判定能否前行,不能的话则表示此路不通,退回到上一个标记点。如果还 能向前走一步,则前进一步并将该点记录下来,然后判定此时的位置是否为指定按钮所在的位置。 如果是则返回 true,否则返回 false。 publicbooleanfind(){//连线算法,用于查找从一个按钮能否到达另一个按钮。 for(inttemp=1; temp<=4; temp++)//东西南北,四次大循环 { change(state, start); firstLine.clear(); switch(temp) { case1:break; case2:turnLeft();break; case3:turnBack();break; case4:turnRight();break; } while(nextStep())//能否向前走一步 { if(go(firstLine))//第一次 returntrue; change(progress, state); //设置标记,左右,两次中循环 for(intk=1; k<=2; k++) { change(state, progress); secondLine.clear(); switch(k) { case1:turnLeft();break; case2:turnRight();break; } while(nextStep()) {
17

商丘师范学院 2015 届本科毕业论文(设计)

if(go(secondLine))//第二次 returntrue; //设置坐标,左右,两次小循环 if((state.x == end.x)|(state.y == state.y)) { change(climax, state); for(intj=1; j<=2; j++) { change(state, climax); threeLine.clear(); switch(j) { case1:turnLeft();break; case2:turnRight();break; } while(nextStep()) { if(go(threeLine))//第三次 returntrue; } } change(state, climax); threeLine.clear(); } } } change(state, progress); secondLine.clear(); } } returnfalse; }

7 测试说明
为了保证系统持久稳定地运行,需要对本聊天软件的登陆验证;聊天功能;消息内容;游戏互 动等模块进行相应的测试。 1.考虑到用户的体验,尤其是界面的美观和使用感受,主要使用人工测试的手段。 2.对于功能模块,我采用黑盒测试的方法,使用 UFT 功能测试工具来完成功能测试。 3.对于代码的执行情况,我使用 Testbed 测试工具来对源程序进行测试,查看其路径覆盖率。

18

商丘师范学院 2015 届本科毕业论文(设计)

总结
对于聊天软件而言,聊天仅仅只是人们交流的一种方式。本聊天软件在支持聊天的同时,还融 入了游戏互动,使人际交往的方式得到了扩展,使交流变得多元化。考虑到这种模式所带来的好处, 本聊天程序在以后还将增加猜谜语等一系列互动形式,通过多角度多维度的沟通手段,来为人们的 交往铺筑一条多彩之路。 在本聊天软件中,框架的使用极大地减少了对数据库的依赖性。不管对程序做了怎样的修改, 在程序重启时,它都会自动维护数据库中表的结构。而且将应用与数据库的连接交给 Hibernate 来管 理,不但提高了性能,而且数据的完整性也得到了保障。如果仍采用传统的 JDBC 方式来操作数据 库,不但需要编写繁琐的连接数据库代码,而且将关系型数据与对象相互转换也变得十分复杂,一 旦数据库中表的数量过多,对整个系统的维护将会变得非常麻烦。由此可见学习的道路真是永无止 尽,我们应该不断地去学习新知识,新思想来开拓视野,取他人之长补己之短。 这次毕业设计的开发实践,培养了我独立发现问题、分析问题、解决问题的能力。虽然目前我 只是做了部分的核心功能,但后期还会继续努力将其变的更加完善。例如:再增加一些其他的互动 形式,如:好友的添加与删除,好友上下线的通知,以及语音聊天等功能,争取把功能做得更强大, 界面做的更绚丽,操作整的更舒适。这次实践仅仅只是一个好的开始,我相信在未来我一定能够不 断地去完善自己的不足,挖掘自己的潜力,展现自己风采,去迎接更加美好的未来。

19

商丘师范学院 2015 届本科毕业论文(设计)

参考文献
[1]张晓龙、刘钊.JAVA 程序设计基础[M].北京:清华大学出版社,2010.7 [2]杨晓光.面向对象程序设计[M].北京:清华大学出版社,2011.1 [3] 李芝兴、杨瑞龙.Java 程序设计之网络编程[M].北京:清华大学出版社,2009.8 [4]王珊、萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2006.5

致谢
在聊天软件开发完成之际,我压抑的心情突然得到了释放。自从确定了这个课题之后,我就一 直在为完成它而不停地奋斗着,努力着,我永远也忘不了这一段对我来说意义非凡的日子。一路走 来有导师的指点,有朋友的鼓励,是你们期盼的目光让我一直坚持下来,感谢一直以来有你们的陪 伴。 在此,由衷的感谢指导老师对我亲切的指导。

20


相关文章:
基于Java的聊天系统(含源文件).doc
基于Java的聊天系统(含源文件)_电脑基础知识_IT/计算机_专业资料。学院 学生...基于 Java 语言对网络编程的支持为了更好地实现聊 天系统的网络传输功能, 使...
基于JAVA的分布式聊天系统设计(含源文件).doc
基于JAVA的分布式聊天系统设计(含源文件)_电脑基础知识_IT/计算机_专业资料。...开发中利用了计算机网络编程的基本理 论知识,如 TCP/IP 协议、客户端/服务器...
...Java的“网络五子棋”游戏的设计和实现(含源文件)_....doc
基于Java的网络五子棋”游戏的设计和实现(含源文件) - 四川师范大学成都学院本科毕业设计 基于 Java 的“网络五子棋”游戏的设计和实现网络版客户端 学生:...
基于java的OA系统的制作(含源文件).doc
基于java的OA系统的制作(含源文件)_电脑基础知识_...(论坛、邮件):主要为工作室成员提供学习、 聊天、...中,开发人员利用其进行开 发时不用再自己编码实现...
基于Java网络音乐系统的设计与实现(含源文件)_图文.doc
基于Java网络音乐系统的设计与实现(含源文件)_互联网_IT/计算机_专业资料。毕业...本系统的开发, 是典型的 Mis 开发。 采用 JSP 编程语言, 已无技术上的问题...
基于Java网络相册系统的设计与实现(含源文件)_图文.doc
基于Java网络相册系统的设计与实现(含源文件)_计算机软件及应用_IT/计算机_专业...(3) Web 开发 Web 开发过程包括后台数据库程序的开发、页面程序的编写和所有...
基于Java网络相册系统的设计与实现(含源文件)_图文.doc
基于Java网络相册系统的设计与实现(含源文件) - 引言 基于 Java 网络相册系统的设计与实现 1 1.1 引言 选题背景 随着时代的进步,社会生产力高速发展,新技术层...
基于Java语言的游戏软件开发(含源文件).doc
基于Java语言的游戏软件开发(含源文件) - 摘要 编程语言从机器语言,汇编语
JAVA聊天室的设计(含源文件)毕业设计论文.doc
JAVA聊天室的设计(含源文件)毕业设计论文 - 本科毕业论文(设计) 题目 基于 JAVA 的聊天室设计与实现 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人...
基于JAVA的BBS系统设计与实现(含源文件)_图文.doc
基于JAVA的BBS系统设计与实现(含源文件) - Java毕业设计,Java课
基于JAVA的网上书店毕业设计(含源文件).doc
基于JAVA的网上书店毕业设计(含源文件)_工学_高等教育_教育专区。本文描述了...语句实现动态网页的,如果用 Java Servlet 来开发整个网站,动态部分和 静态页面...
基于JAVA的网上书店含源文件毕业设计论文.doc
基于JAVA的网上书店含源文件毕业设计论文_工学_高等...(THESIS) 网上书店系统 Online BookStore System 学...开发时使用得最热门的编程语言,本文 描述了 JAVA ...
基于Java的网上书店系统的设计与实现(含源文件)_图文.doc
基于Java的网上书店系统的设计与实现(含源文件) - 盐城师范学院 毕业论文(设计) 2013-2014 学年度 基于 Java 的网上书店系统的设计与实现书籍管理部分 学生姓名 ...
基于Java_Web技术开发的BBS论坛(含源文件)_图文.doc
基于Java_Web技术开发的BBS论坛(含源文件)_计算机软件及应用_IT/计算机_专业...查询语言实现的.重点介绍了学 生成绩管理系统的实现过程:包括系统分析, 系统调查...
基于java网上书店的设计与实现(含源文件)毕业设计.doc
基于java网上书店的设计与实现(含源文件)毕业设计 - 毕业设计 题 目: 网上书店的设计与实现 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:...
基于Java网络相册系统的设计与实现(含源文件)毕业设计_....doc
基于Java网络相册系统的设计与实现(含源文件)毕业设计 - 基于 Java 网络相册系统的设计与实现 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:...
基于Java的在线音乐系统的实现(含源文件)_图文.doc
基于Java的在线音乐系统的实现(含源文件) - 2013 年度本科生毕业论文(设计) 在线音乐系统的实现 学专年 院: 业: 级: 电子信息工程学院 计算机科学与技术 2009...
基于java的航空查询系统(含源文件)_图文.doc
基于java的航空查询系统(含源文件)_电脑基础知识_IT/计算机_专业资料。湖北经济学院法商学院专科毕业(设计)论文 摘 要 在现实生活,人们往往要处理大量繁杂的数据...
基于JAVA的网上书店含源文件毕业设计.doc
基于JAVA的网上书店含源文件毕业设计_工学_高等教育...应用程序开发时使用得最热门的编程语言, 本文描 述...框架,并完成一个基于这种技术的网上书店 系统。 【...
基于java的标准化考试系统(含源文件).doc
基于java的标准化考试系统(含源文件)_电脑基础知识_...JSP 技术和 MYSQL 数据库以及其他网络程序设计开发...基于java的局域网聊天系... 暂无评价 46页 免费...
更多相关标签: