基于JAVA语言的网络聊天系统开发与实现含源文件Word格式文档下载.docx
《基于JAVA语言的网络聊天系统开发与实现含源文件Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于JAVA语言的网络聊天系统开发与实现含源文件Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
6.3.4聊天界面Chart15
6.3.5游戏界面Game16
6.3.6游戏规则17
6.3.7算法思路17
7测试说明18
总结感想19
参考文献20
致谢20
基于JAVA语言的网络聊天软件
摘要
本聊天软件是使用Java编程语言来完成开发的。
在软件的开发过程中,使用Socket来进行网络通信,使用Swing来绘制界面,使用开源的对象关系映射框架Hibernate来进行数据访问。
其中Hibernate能够使程序员以面向对象的思维来处理关系型数据。
本聊天软件不仅支持聊天,还加入了“连连看”游戏。
该游戏让人们之间的交流得到延伸,让彼此之间的关系更进一步。
本聊天软件主要有以下三个功能:
一、登录验证;
二、聊天通信;
三、游戏互动。
关键词
聊天;
Java;
Swing;
套接字;
Hibernate
NetworkChatSoftwareBasedonJAVALanguage
Abstract
ThischatsoftwarewasdevelopedbyusingtheJavaprogramminglanguagetocomplete.Intheprocessofsoftwaredevelopment,Socketisusedfornetworkcommunication,Swingisusedtodrawtheinterface,objectrelationalmappingframeworkHibernateopensourceisusedfordataaccess.Hibernateallowsprogrammerstodealwithrelationaldatainobject-orientedthinking.Thischatsoftwarenotonlysupportchatatthesametime,alsojoinedthe"
LinkUpFree"
game.Thegameallowscommunicationbetweenpeoplehasbeenextended,sothattherelationshipbetweeneachothermore.Thissoftwaremainlyhasthefollowingthreefunctions:
First,landingvalidation;
Second,chatcommunications;
Three,theinteractionofthegame.
Keywords
Chat;
Java;
Socket;
Swing;
Hibernate
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是一个真正的多用户、多线程数据库服务器,是以客户端/服务器架构实现的,它由一个服务器守护线程和很多不同的客户程序和库组成。
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数据层需求分析
数据层实现的功能主要有:
响应来自服务器的数据访问请求。
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;
//消息的类型
privateDatesenDate=newDate();
//消息创建的时间
privateUsersender;
//消息的发送者
privateUseraccepter;
//消息的接收者
privateStringcontent;
//消息的内容
}
其中,消息的类型在服务器和客户端都遵循着统一的标准。
这样的话,客户端发给服务器什么样的消息,服务器在解析出消息的类型之后,就可以进行相应的操作了。
为了实现消息载体以对象的形式在网络间进行传递,该消息类必须实现Java中的序列化接口,这一点是其他通过字节流或者字符流传递消息所不同的。
6.2服务器
6.2.1主服务器Server
主服务器主要充当一个前置服务,用来接收客户端的连接。
在获得一个客户端的连接后就会产生一个虚拟服务器,并将该连接委托给虚拟服务器让它来为用户提供服务。
同时主服务器也维护着所有的虚拟服务器,它扮演着一个管理者的角色[3]。
//服务器维护的虚拟服务器列表,一个Map集合,通过<
用户的账号:
为该用户服务的虚拟服务器>
这种键值对的对应关系来管理虚拟服务器。
privatestaticHashMap<
Integer,VirtualServer>
usersOL=newHashMap<
();
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){//登录验证操作
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){//拒绝好友的游戏邀请
}elseif(msg.getType()==44){//由获胜方通知失败方,胜负情况
}
}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);
密码不对!
}else{//账户、密码正确
if(Server.getUsersOL().get(user.getAccount())==null){//可以登陆
msg.setType(13);
msg.setAccepter(u);
}else{//已登录
msg.setType(14);
不能重复登录!
returnmsg;
}}
登录验证,主要分为三步:
1.首先验证用户的账号合法性,即该账号是否存在。
只有账号存在才会进行后续的验证。
2.如果用户的账号存在,再验证密码是否与账号匹配,如果匹配成功,则返回该用户的信息。
3.接下来则从主服务那里去判定该用户是否已经登录,对于已登录的用户则不再给予登录操作。
6.2.4Hibernate配置文件
访问数据的操作要借助Hibernate框架来完成。
使用了Hibernate,我们就可以不用再写很复杂繁琐的JDBC语句去建立与数据库的连接,而将这些操作全都交给Hibernate来完成。
Hibernate的配置文件如下:
<
session-factory>
<
!
—在控制台打印出执行数据访问的SQL语句-->
<
propertyname="
show_sql"
>
true<
/property>
—连接数据库所使用的驱动程序-->
hibernate.connection.driver_class"
com.mysql.jdbc.Driver<
--连接数据库的地址-->
hibernate.connection.url"
jdbc:
mysql:
//localhost:
3306/NFC<
hibernate.connection.username"
root<
hibernate.connection.password"
846255<
--数据库的方言,该方言用于对数据库的操作进行解释-->
hibernate.dialect"
org.hibernate.dialect.MySQLDialect<
—开启数据库定义语言,用于自动创建表结构-->
hibernate.hbm2ddl.auto"
create<
--映射的实体类-->
mappingclass="
cn.newcapec.model.Crowd"
/>
cn.newcapec.model.User"
/session-factory>
/hibernate-configuration>
6.2.5Hibernate会话工厂
在完成了配置之后,为了可以使用它来进行数据的操作,我们需要先创建会话工厂,因为数据的操作是基于会话的。
会话工厂的代码如下:
publicclassHibernate{
privatestaticSessionFactorysf=null;
//会话工厂
privatestaticSessionsession=null;
static{
Configurationcf=newConfiguration();
cf.configure();
//在默认路径下,读取配置文件。
ServiceRegistrysr=newStandardServiceRegistryBuilder().applySettings(cf.getProperties()).build();
sf=cf.buildSessionFactory(sr);
session=sf.openSession();
privateHibernate(){}
publicstaticSessionFactorygetSessionFactory(){returnsf;
publicstaticSessiongetSession(){r