基于java的聊天系统的设计与实现

基于java的聊天系统的设计与实现

ID:8321245

大小:2.16 MB

页数:41页

时间:2018-03-19

上传者:U-5649
基于java的聊天系统的设计与实现_第1页
基于java的聊天系统的设计与实现_第2页
基于java的聊天系统的设计与实现_第3页
基于java的聊天系统的设计与实现_第4页
基于java的聊天系统的设计与实现_第5页
资源描述:

《基于java的聊天系统的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

本科生毕业论文(设计)基于java的聊天系统的设计与实现姓  名学  号专  业计算机科学与技术指导教师2015年5月30日XXXV 摘 要随着互联网的发展,即时通讯工具正受到更大用户群体的青睐。即时通讯(InstantMessenger,简称IM)是指一种能够让使用者即时发送和接收互联网消息的实时通讯服务。即时通讯的最大特点在于它的即时性,只需通信双方同时在线,就能像多媒体电话一样,实现文字、档案、声音、影像等信息的互传。在网络环境的支持下,通信双方可以便捷的实现信息交互,而不受物理距离的限制。因此即时通信系统在当今社会中有着非常重要的地位。本论文详细的论述了即时通讯系统的客户端和服务器端的主要组成模块,研究了各系统模块的实现方式和具体设计方案,重点阐述了各模块的主要功能,并通过模块流程图加以展示。系统采用面向对象和模块化的设计方法,主要运用了网络通信技术、数据库技术、多线程技术等计算机相关技术,实现了文本通信、用户分组等功能,具有较强的通信实时性。该系统基于C/S体系结构和MVC框架,使用Java语言进行开发,实现了多用户的即时通信。设计并实现了用户注册、登录、用户列表、多用户即时聊天等功能。基于Swing开发了较完整的图形用户界面(GUI);通过套接字编程实现了通信功能。在上述技术研究的基础上,本文构建了局域网环境下,面向普通用户的即时通讯系统,该系统能够满足基本的通信需求。同时该系统采用模块化程序设计模式,因此具有较好的系统扩充性。关键词:即时聊天;socket;局域网;javaIII AbstractWiththedevelopmentoftheInternet,instantmessagingtoolisfavoredbymoreandmoreusergroups.IM(InstantMessenger,IM)referstoakindofreal-timecommunicationservicewhichallowsuserstosendandreceiveInternetmessagesinstantly.ThebiggestcharacteristicofInstantmessagingisitsimmediacy,justcommunicationonlineatthesametime,bothsidescanrealizetosendtheinformationtoeachotherlikemultimediaphone,suchastext,archives,soundandimage.Withthesupportofnetworkenvironment,bothcommunicationsidescaneasilyrealizetheinformationinteraction,whichcan’tberestrictedbyphysicaldistance.Soinstantcommunicationsystemhasaveryimportantpositionintoday'ssociety.Thepaperdiscussesthemainmodulesoftheclientandserversideoftheinstantcommunicationsystemdetaily,studiesthewayofrealizationofeachsystemmoduleandthespecificdesign,expoundsthemainfunctionsofeachmodule,anddisplaysthembymoduleflowchart.Withstrongreal-timecommunication,thesystemadoptsobject-orientedandmodulardesignmethod,mainlyusescomputertechnology,suchasthenetworkcommunicationtechnology,databasetechnologyandmultithreadingtechnology,andhasrealizedthetextcommunication,usergroupandotherfunctions.ThesystemisbasedonC/SarchitectureandMVCframework,usesJavalanguagedevelopment,andrealizesthemulti-userreal-timecommunication.Thesystemdesignsandimplementstheuserregistration,login,theuserlist,multi-userinstantmessaging,etc.BasedontheSwing,thesystemdevelopesacompletegraphicaluserinterface(GUI).Throughsocketprogramming,thesystemachievesthefunctionsofcommunication.Onthebasisoftheabovetechnologyresearches,thispaperconstructstheinstantmessagingsystem,whichisdesignedforordinaryusersattheLANenvironmentandcanmeetthebasiccommunicationrequirements.Atthesametime,adoptingthemodularizedprogramdesignpatterns,thesystemhasagoodsystemexpansion.KeyWords:InstantChat,Socket,LocalAreaNetwork,JavaIII 目 录1引言11.1开发的背景11.2开发的目的和意义11.3研究的内容11.3.1即时通讯原理11.3.2Swing技术21.3.3MVC设计模式21.3.4系统的构建22涉及的相关技术32.1java语言32.2c/s模式32.3即时通讯原理42.4mysql数据库应用42.5Socket通信技术42.6开发环境的搭建53系统分析63.1系统基本功能实现63.2可行性分析63.2.1技术可行性63.2.2经济可行性63.2.3操作可行性63.3系统需求分析63.3.1系统需求列表63.3.2功能性需求分析分析73.3.3非功能性需求分析84系统设计104.1数据库概要设计104.2系统模块设计114.2.1聊天系统工作原理114.2.2总功能模块124.2.3系统用例图134.2.4活动图17IV 4.3系统类设计194.3.1MessageType类的设计194.3.2登陆类图的设计194.3.3服务端线程的设计205聊天系统实现235.1实现概况235.2注册模块235.3登录模块265.4聊天模块295.5添加删除好友模块316研究结论346.1总结346.2展望34参考文献35致谢361IV 1引言1.1开发的背景互联网和信息技术的快速发展,促使聊天工具成为重要的一种沟通工具,人们越来越喜欢通过聊天工具来进行交流。现在,已近出现了很多很好很成熟的聊天工具,比如说微信,腾讯QQ,易信,飞信等等。但是这些聊天工具功能太过强大,且是第三方通信软件,面临着信息安全的问题。传统的交流方式列如电话电子邮件等,这些手段要不费用太高,要么实用性不强,所以一些个人和企业等组织机构,为了满足自己和企业的沟通需求,就自行研发即时聊天工具来代替传统的电话、传真、邮件等沟通方式。即时聊天工具可以说成为继电话、E-Mail之后比较受欢迎的新应用,随着软件、网络、通讯现代技术的快速发展,即时聊天工具在沟通、协作方面将显现出更大的方便、快捷、实用的优势。1.2开发的目的和意义随着计算机技术特别是计算机网络的快速发展,人们生活的方方面面得到了深刻的改变。人们以低廉的价格,开发出实用、方便的聊天工具。各种在线服务系统正深刻的影响着人们的联系和交流方式,希望可以远距离的进行即时通讯。现代生活在慢慢摆脱过去的种种老旧的联系方式,网络聊天工具便应运而生,成为了一种方便消费者和人们之间联系的实用系统。网上聊天系统的完善,为人们的交流与联系提供了一个平台。基于java聊天工具的出现同时也解决了企业等机构内部交流不畅的问题,将聊天工具用在内部交流上,同时缓解了员工面对面向领导汇报的压力,领导也拜托了繁琐的交谈,双方都更加专注于自己的工作上。同时,聊天工具的作用日益强大,人们进行及时聊天少不了网络通信技术。利用网络通信技术开发的聊天工具有很多,比如QQ聊天工具就是众所周知的聊天软件。最初通信工具的改进是由于人们的交流方式的改变而发生的,但随着企业内部的通讯工具的出现,在企业管理中即时信息将发挥更大的作用,由此观之,聊天工具的意义和价值已经不仅仅局限于进行交流与沟通了。1.3研究的内容1.3.1即时通讯原理36 首先打开服务器端的程序,建立serversocket等待客户端的登陆请求;客户端首先进行身份的验证,如果用户名密码的格式正确则和服务器端建立socket连接,通过服务器验证登陆信息是否和数据库的用户信息匹配,如果匹配则发送好友信息建立好友列表。该用户查看自己的好友上线信息,进行通信,用户的每次通讯信息都会用message进行信息的打包,将打包好的message发送给服务器端,服务器端根据messagetype信息类型,再将信息转发给其他用户。这是一个典型的C/S模式。1.1.1Swing技术Java的swing技术主要用于进行UI的的实现,包括对原型图的实现,以及包括对事件的监听和消息的发送等,实际上的功能就是向用户展示界面和进行用户的交。对于一个典型的mvc架构的系统,swing主要实现了view层,在我的聊天系统中界面包括有注册界面,登陆界面,好友列表界面,聊天界面,和开启服务器界面等。1.1.2MVC设计模式MVC是一种典型的软件设计模式,M代表的是Model层,V代表的是View层,C代表的是控制器层,主要是将代码分离,实现了用户交互的视图,业务逻辑,以及数据的分离,有利于代码的扩充,和架构的搭建,也实现了软件设计高内聚低耦合的思想,将相似的功能进行模块化,突出了面向对象的功能。其中,control层是View和model进行连接的关键,其将数据进行模型化,然后交给控制器进行显示。1.1.3系统的构建系统整体架构采用C/S模式客户端的所有请求都是通过服务器端进行处理,通过服务器端对数据库的操作来响应客端的各种请求,MySQL作为数据库,mysql既经济又实惠。236 1涉及的相关技术为了保证系统能正常实施,先来分析一下系统所需要的相关技术和协议。1.1java语言由于对java语言相对来说比较熟悉,所以选择面向对象的java语言来完成毕业设计的软件部分,下面对java语言从技术的可行性方面做简要的介绍[1]。Java语言的出现极大的提高了软件开发的效率,java语言的三大特征封装,继承,和多态。封装是面向对象最基础的特性,将属性和方法进行封装构成一个类,当真正使用这些属性和方法来实现一些功能的时候,我们注意的不在是哪些属性和方法,而是一个一个的对象,使用对象来实现这些方法,其实这也是高内聚的一种体现。继承则很好的解决了代码的冗余问题,将不同类的相似功能进行抽象,组建成父类,让子类去继承这些父类,就没必要再去写父类的属性和方法,很好的解决了代码的冗余问题。多态则是很好的体现了软件设计的开闭原则的思想,对扩充开发,对修改关闭,说白了就是指向父类的指针已经可以指向其子类,为了实现软件的开闭原则,能用子类的地方尽量用父类来进行指代,便于对功能的扩充。1.2c/s模式C/S模式就是将一整个系统进行划分,包括客户端和服务器端,客户端主要用于和用户的交互,而服务器端主要用于数据的管理和逻辑处理,从而提高整个系统的响应速度和应变能力,从而提高用户的满意程度[2]。通过相应的网络协议客户机和服务器之间来进行通讯,在服务器工作的情况下,客户机会向服务器发出数据请求,然后服务器将数据传送给客户机进行部分计算,计算完毕,计算结果可以返回给服务器。这种c/s模式的优点充分利用了客户机端的计算的性能,使计算的能力得到很大提高;另外,由于是通过网络协议来进行客户机和服务器之间的通讯,仅仅是一种逻辑上的相互联系,因此在客户机和服务器两端在物理上是易于扩充的。C/S模式是曾经很长一段时间主流的网络模式[3]。在工作过程中该模式的主要过程如下:首先开启服务器,并根据得到的请求进行相应服务回复:1>首先在一个公认的IP地址上打开服务器端程序,同时通知本地的客户端程序,服务器已经打开,然后等待客户端请求。36 1>客户端发送自己的请求。2>服务器端接受客户端的请求,并处理客户端的请求。3>返回第二步,等待其他客户请求。4>没有客户端请求后,关闭该服务器。客户端:1>打开自己的通讯端口,并和特定的服务器端的端口建立连接,直到收到建立连接成功的通知。2>然后通过通信通道向服务器发送自己的服务请求报文,等待并接收服务器端应答;然后继续提出请求。3>请求结束并得到处理后关闭自己的通信通道并终止与服务器的连接。客户机/服务器模式的特点是分布运算和分布管理,因此最后我选择了C/S模式。1.2即时通讯原理首先进行注册,注册成功后,用自己的账号和密码登陆聊天软件,登陆成功后即显示出自己的好友列表,在线的好友则显示亮头像,不在线的好友显示灰色头像。双击好友头像就会显示出与好友的聊天界面。在聊天页面上,有输入信息框,和显示对话消息的面板,当需要发送消息时,在下端的输入框中输入即将发送的消息,然后点击“发送”按钮,程序就会自动把输入的信息内容、对方的ID号,本人的ID号、以及当前时间等内容打包成一个Message对象通过Socket发送到服务器端。当服务器接收到Message之后,按照既定的message类型的协议进行解析和转发。这样,双方就实现了即时通讯。1.3mysql数据库应用使用MySQL存储用户信息,借助于navicate界面工具对数据库进行快速的创建,并采用JDBC技术对数据库的信息进行增删改查。使用navicate对其进行数据操作,可以很大程度上增加数据操作的方便性[5]。1.4Socket通信技术Socket的工作原理:1>首先是建立Socket连接:在通信双方之间建立一条虚拟的通信通道,进行信息的发送与接收。36 1>数据通信:利用虚拟连接通道传送数据信息进行通信。2>关闭:通信结束时,再将所建的虚拟连接拆除。具体的通信过程如下:1>启动服务器端程序,打开serversocket端口,监听客户端发送socket连接。2>启动客户端,由已知serversocket端口和IP地址,向服务器请求建立socket连接,服务器端接受socket后,单独开启一个线程用于处理该请求,然后继续监听其他的客户端请求。3>建立socket后,客服端服务器端通过Message协议进行通信,首先message会将各类消息打包成Message包,然后发给服务器,服务器则根据MessageType中的信息类型进行不同的处理,并回复给客户端。4>不停的进行信息的读写,知道有一端终端连接。Socket通信技术介绍如图2-1所示。图2-1Socket通信技术1.2开发环境的搭建使用MyEclipse10.0进行软件开发,整体采用C/S模式,MySQL作为数据库,使用NavicatforMySQL进行数据库的信息添加。236 1系统分析1.1系统基本功能实现客户端可以实现注册,即时聊天,添加好友,删除好友,显示好友在线状况等功能。服务器端应当先特定端口建立一个ServerSocket,并且不断监听是否有客户端建立连接或者断开连接。服务器端应当是一个各类消息的发送中心,所有客户端的信息都是通过socket连接传到服务器端,由服务器端根据各类消息的类型进行消息的分发。1.2可行性分析本系统的可行性分析包括以下几个方面的内容:1.2.1技术可行性Socket技术和swing技术的使用,以及navicate的应用,包括C/S模式的采用,可以快速的进行系统原型的设计,可以很方便的地开发出基于网络的高效、简便、实用、的即时通讯系统,1.2.2经济可行性基于计算机应用的计算机网络已经非常普及,因此对于网络设备不需要进行很大的花费。本系统仅仅需要一个安装mysql数据库的服务器,由于受并发人数的限制,所以成本不会很高。1.2.3操作可行性在局域网中,只要有一台以上的计算机相互连接,本聊天系统就可以进行安装使用,所以在操作上不会出现什么太大的问题。如果真正要实现internet上少许人员的通讯,只需要在一个有固定IP地址的计算机上运行服务器端程序。综上所述,即时通讯系统在技术、经济、操作上都是可行的。1.3系统需求分析1.3.1系统需求列表经过对整个系统的分析,可得出如表3-1所示的系统需求列表。36 表3-1系统需求列表编号执行者功能优先级01用户注册高02用户登陆中03用户聊天高04用户添加好友中05用户删除好友中1.1.1功能性需求分析分析本系统要实现的功能如下:1>注册首先用户填写注册信息,填写完后提交,先在客户端进行基本信息的审查,然后将信息提交给服务器。服务器收到用户的请求,便开始接受客户传递的message信息,比如用户的qq号,昵称,密码,性别等信息,接受完毕后,便与后台数据库通过JDBC连接,然后向数据库添加用户信息,如果添加成功,则通知用户注册成功,客户收到登陆成功的信息后,便用该qq号和密码进行登陆。2>登陆用户填写登陆信息,比如号码和密码,然后与服务器建立连接,将登陆信息传送给服务器,服务器收到后,开始通过JDBC读取数据库信息,然后与用户输入的登陆信息进行比对,如果成功,客户端就向服务器请求读取好友信息,服务器收到该请求后,从数据库中取出好友列表信息,然后将好友列表信息打包成message信息,通过通信协议,然后向客户端发送这些信息,客户收到这些信息后就在主程序窗口中显示好友列表。3>聊天客户端首先在自己的信息输入框中填写自己即将发送的消息,然后点击发送按钮,客户端接受到发送指令后将发送的信息打包成message信息,然后通过已经建立的socket接口将message信息发送给服务器端。服务器端接受到信息后在socket的hashmap中找到对应的接受者的socket连接然后将信息转发出去。这样就完成了一次信息的接受与发送了,从而实现了聊天功能。4>添加好友36 在登陆的主界面,点击添加好友,然后输入好用号,点击添加,添加好友信息就会被打包成message信息,通过socket发送给服务器。服务器接受后通过JDBC向mysql数据库的personalinfo表查询是否存在好友信息,如果查询成功,就会向客户端发送添加成功信息,同时将好友信息添加到friend表中,如果查询失败,就会向服务器发送添加失败信息。1>删除好友在登陆的主界面,点击删除好友,然后输入好友号,点击删除,删除好友信息就会被打包成message信息,通过socket发送给服务器。服务器接受后通过JDBC向mysql数据库的friend表查询是否存在该好友,如果查询成功,就会向客户端发送删除成功信息,同时在friend表中删除该条信息,如果查询失败,就会向服务器发送删除失败信息。1.1.2非功能性需求分析对于非功能需求,本系统只有界面上的需求。主要包括登录界面,如图3-1所示;注册界面,如图3-2所示;好友列表界面,如图3-3所示。界面设计时,参考腾讯QQ、微信等的布局,采用蓝色与灰色搭配,使人看上去清楚明了。图3-1登陆界面36 图3-2注册界面图3-3好友列表界面36 1系统设计1.1数据库概要设计本系统所包含的主要实体和其属性:Personalinfo信息表(用户账号,用户名,密码,性别,状态),其中Qnum是用户的账号,即Qq号,是主键,不可为空,其他字段的详细介绍如表4-1所示[7]。表4-1Personalinfo信息表编号字段说明字段类型长度是否为主键是否为空01QnumQq号Varchar20是否02Petname用户名Varchar20否否03Password密码Varchar20否否04Sex性别Varchar20否否05Status状态Varchar4否否Personalinfo信息表这个实体各个属性如图4-1所示。图4-1Personalinfo信息表friend信息表(自己账号,好友账号),其中Myqno和Friendqno均不能为空。表4-2friend信息表编号字段说明字段类型字段长度是否为主键是否为空01Myqno我的Qq号Varchar20是否02Friendqno朋友Qq号Varchar20是否friend信息表这个实体各个属性如图4-2所示。36 图4-2friend信息表Personalinfo表和friend表的整体数据库E-R图如图4-3所示。图4-3数据库整体E-R图1.1系统模块设计1.1.1聊天系统工作原理此聊天系统的工作原理图描述如图4-4所示。36 图4-4系统工作原理图首先在局域网内打开服务器端程序,等待客户端的连接请求,客户端发送自己的连接请求,服务器接受后会和客户端建立一个socket连接并将socket加入到自己的进程map中,然后客户端发送消息给服务器,服务器接受到消息后,将消息分解然后通过自己再发送给接受者的客户端程序,至此一次通讯结束。1.1.1总功能模块经过分析,系统的功能结构图如图4-5所示。图4-5系统功能模块图36 系统功能描述如下,服务器端开启和关闭服务器的功能,以及对数据库的操作,包括增删改查的数据操作,客户端有注册,注册成功后有登陆、聊天、增加好友删除好友等功能。1.1.1系统用例图客户端系统的用例图,如图4-6所示。图4-6客户端系统用例图用户通过注册和登陆使用客户端系统的功能,首先必须注册成为该系统的用户,然后登陆该系统进行聊天,以及添加好友和删除好友。36 客户端注册用例分析如表4-3所示。表4-3客户端注册用例列表用例标识号01用例名称用户注册创建者***创建时间***执行者用户说明用户填写注册信息,通过服务器验证后可以使用该系统先决条件用户进入注册界面请求结果系统将用户信息写入数据库优先级H使用频度H普通过程执行者行为1.点击注册3.填写个人信息,完毕后点击‘确定’提交系统响应2.显示注册界面4.系统校验用户的输入,如果合法,则会进入数据库验证环节,如果验证成功,则返回登陆成功信息可选过程例外可选过程1:用户注册验证不通过1.1系统继续保持注册界面,并显示错误提示信息“******”。可选过程2:用户注册信息不完整2.1系统继续保持注册界面,并显示错误提示信息“******”。包括无特定需求无假设无注释和问题无36 用户登录用例分析如表4-4所示。表4-4用户登录用例列表用例标识号02用例名称用户登陆创建者***创建时间***执行者用户说明用户通过自己的账号和密码进入聊天系统,使用系统提供的聊天功能先决条件用户已获得登录系统的账号和密码请求结果登陆成功,显示好友列表优先级M使用频度H普通过程执行者行为1.用户输入用户名和密码,单击确定“提交”,登陆系统系统响应2.系统校验用户的输入,如果合法,则2.1转入系统的主界面可选过程A:忘记密码例外可选过程1:用户登陆验证不通过1.1系统继续保持登录界面,并显示错误提示信息“******”。可选过程2:用户登陆信息不完整2.1系统继续保持登录界面,并显示错误提示信息“******”。包括无特定需求无假设无注释和问题无36 用户登录后进行聊天,聊天用例分析如表4-5所示。表4-5聊天用例列表用例标识号03用例名称聊天创建者***创建时间***执行者用户说明系统用户进行聊天先决条件用户已登录该系统请求结果获得聊天信息优先级H使用频度H执行者行为1.用用户输入聊天信息,单击“发送”系统响应2.接受用户的信息查找接受人3.如果接受人在线3.1系统将信息发送给接受者3.2准备下一次输入可选过程例外可选过程1:用户登陆验证不通过1.1系统继续保持登录界面,并显示错误提示信息“******”。可选过程2:信息接受者不在线2.1信息丢弃包括无特定需求无假设无注释和问题无36 用户添加删除好友用例分析如表4-6所示。表4-6添加删除好友用例列表用例标识号04用例名称添加/删除好友创建者***创建时间***执行者用户说明用户可以通过系统添加或删除好友先决条件该用户已经登陆该聊天系统请求结果系统修改数据库的好友信息,并返回添加/删除好友成功优先级M使用频度M普通过程1.输入添加/删除好友的账号号系统响应2.检测该好友是否存在3.如果存在,则3.1数据库的好友信息,并返回添加/删除好友成功可选过程例外可选过程1.好友不存在1.1返回添加/删除的错误信息“**************”包括无特定需求无假设无注释和问题无1.1.1活动图1>用户登陆活动图首先填写登陆信息,提交以后服务器会对用户名和密码进行验证。如果不正确,返回一个提示信息。如果登陆成功,就更新在线状态。通知所有好友自己已经上线。如图4-8所示[6]。36 图4-7用户登录活动图1>发送消息活动图短消息发送以后,服务器端对应的监听线程会接收到一个数据包。此包中包含接收者的信息,如果接收者在线,数据包将会转发到接收者。如果不在线,存在服务器端,等它上线在发送。如图4-9所示。36 图4-8发送消息活动图1.1系统类设计1.1.1MessageType类的设计MessageType规定了通信包的种类,相当于通信协议,对整个通信内容的转发都至关重要。MessageType类的内容如下:publicinterfaceMessageType{Stringmessage_succeed="1";//表明是否成功Stringmessage_login_fail="2";//表明失败Stringmessage_comm_mes="3";//普通信息包Stringmessage_get_onLineFriend="4";//要求在线好友的包Stringmessage_ret_onLineFriend="5";//返回在线好友的包Stringmessage_sql="6";//请求sql查询Stringmessage_check="7";//请求验证登陆}1.1.2登陆类图的设计登录类图详细设计如图4-10所示。类图中的类说明如表4-7所示,方法说明如表4-8所示。36 图4-10登录类图表4-7类说明类名说明Register省略登陆界面的组件和按钮事件的处理方法QqClientUser登陆业务逻辑类,登陆信息查询User用户信息类,对用户信息进行封装QqClientConServer客户端连接服务器端类表4-8方法说明方法名说明QqClientUser类的sql方法将用户信息向QqClientConServer发送QqClientConServer类的SendSqlInfoToServer方法将封装好的用户信息发送给服务器端1.1.1服务端线程的设计36 服务器端的核心是对应客户的线程,每个socket对应一个线程,也就是每一个客户端都在服务器端有一个相应的线程。它负责转发客户端发来的消息。类图设计如图4-11所示。类图中属性说明如表4-9所示,类说明如表4-10所示,方法说明如表4-11所示。图4-11服务端线程类图表4-9属性说明属性说明ManageClientThread类中的hm属性装有所有线程的静态hashmap表表4-10类说明类名说明MyServerFrame服务器端界面类省略组件MyQqServer服务器端的控制类QqServerUser实现服务器端到数据库的控制层SqlHelper链接数据库接口ManagerClientThread具体的管理各个线程的添加删除SerConClientThread服务器端线程类36 表4-11方法说明:方法名说明QqServerUser类的SerInsertFriend方法增加好友的数据控制方法QqServerUser类的SerInsertpersonalinfo方法添加注册用户的数据控制方法啊QqServerUser类的showFriend方法返回好友信息QqServerUser类的SerDelFriend方法删除好友信息的方法QqServerUser类的CheckUser方法登陆信息验证的方法SerConClientThread类的SerConClientThread方法线程的构造方法,创建服务器端线程SerConClientThread类的notifyOther方法登陆之后发送给所有好友SqlHelp类的SqlUpdate方法数据库更新方法SqlHelp类的SqlQuery方法数据库查询方法ManagerClientThread类的addClientThread方法向HashMap中添加线程ManagerClientThread类的getClientThread方法向HashMap中得到具体的线程ManagerClientThread类的getAllOnLineUserid方法得到所有在线线程的方法136 1聊天系统实现1.1实现概况本系统可分为登录、聊天、文件、用户管理和注册五个功能模块。“登录”模块为用户提供登录界面,并在用户登录显示好友列表;“聊天”模块实现用户的即时传送信息,即多用户即时聊天,可以发送文字或者截图;“文件”模块主要实现一用户向另一用户发送文件,对方可以选择接受或者拒绝。聊天记录会以文本文档格式保存。“用户管理”模块即管理员对用户进行增删改查,和踢用户下线的操作。下面详细介绍各个模块的具体实现。1.2注册模块1>流程图用户点击注册按钮,然后在注册界面填写用户信息,服务器验证完信息后,会将用户信息写入数据库,用户可以通过该账号登陆系统。如图5-1所示。图5-1注册模块流程图36 1>关键代码如下是注册界面的关键代码,Jlabel用来显示提示框,JtextField用来显示输入的信息,最后的两个button用来触发事件,实现注册功能的代码如下:Register构造方法主要功能是实现界面,而actionPerformed则对事件进行监听,监听到点击事件后用qqClientUser对信息进行包装并发送查询请求,如果查询成功则显示添加成功对话框,如果查询失败则显示失败对话框,下面是实现注册界面的关键代码:publicclassRegisterextendsJFrameimplementsActionListener{JLabeljl1,jl2,jl3,jl4,jl5;JTextFieldjtf1,jtf2,jtf5;JPasswordFieldjtf3,jtf4;JButtonjb1,jb2;JPaneljp;publicRegister(){jl1=newJLabel("QQ号码",JLabel.CENTER);jl2=newJLabel("昵称",JLabel.CENTER);jl3=newJLabel("性别",JLabel.CENTER);jl4=newJLabel("密码",JLabel.CENTER);jl5=newJLabel("确认密码",JLabel.CENTER);jtf1=newJTextField();jtf2=newJTextField();jtf5=newJTextField();jtf3=newJPasswordField();jtf4=newJPasswordField();jb1=newJButton("确定");jb1.addActionListener(this);jb2=newJButton("重置");jb2.addActionListener(this);jp=newJPanel(newGridLayout(6,2,4,4));jp.add(jl1);jp.add(jtf1);//号码jp.add(jl2);jp.add(jtf2);//昵称jp.add(jl3);36 jp.add(jtf5);//性别jp.add(jl4);jp.add(jtf3);jp.add(jl5);jp.add(jtf4);jp.add(jb1);jp.add(jb2);this.add(jp);this.setSize(325,220);this.setIconImage((newImageIcon("image/头像.GIF").getImage()));this.setTitle("QQ用户注册");this.setVisible(true);}下面是监听注册事件的关键代码:publicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubif(e.getSource()==jb1)//确定按钮{QqClientUserqqClientUser=newQqClientUser();Useru=newUser();u.setOperation("2");u.setQum(jtf1.getText());u.setPetname(jtf2.getText());u.setPassword(jtf3.getText());u.setSex(jtf5.getText());u.setOperation("3");if(qqClientUser.Sql(u)){JOptionPane.showMessageDialog(this,"添加成功","",JOptionPane.INFORMATION_MESSAGE);}else{JOptionPane.showMessageDialog(this,"添加失败","",JOptionPane.WARNING_MESSAGE);}}elseif(e.getSource()==jb2){//重置按钮jtf1.setText("");jtf2.setText("");jtf3.setText("");36 jtf4.setText("");jtf5.setText("");}}}1>注册界面每一个用户必须通过注册界面成为本系统的用户之后,才能使用该系统。登陆界面包括qq号码,昵称,性别,密码,确认密码几个部分。注册界面如图5-2所示。图5-2注册界面1.2登录模块1>流程图登陆的时候,用户填写自己的登陆信息,包括用户账号和密码,然后将用户信息打包成Message信息发给服务器,服务器验证完用户信息后,如果符合则登陆成功,如果不符合则登陆失败。具体流程图如图5-3所示。图5-3登录流程图36 1>关键代码(1)客户端代码登录事件是定义在classIMClientLoginextendsJFrame这个类的监听事件中。登录成功后,立即向服务器请求自己的好友列表,客户端实现登录功能的关键代码如下:登陆界面布局代码如下:publicvoidactionPerformed(ActionEvente){if(e.getSource()==jp1_jb1){QqClientUserqqClientUser=newQqClientUser();Useru=newUser();u.setQum(jp2_jtf.getText().trim());u.setOperation("1");u.setPassword(newString(jp2_jpf.getPassword()));publicvoidactionPerformed(ActionEvente){if(e.getSource()==jp1_jb1){QqClientUserqqClientUser=newQqClientUser();Useru=newUser();u.setQum(jp2_jtf.getText().trim());u.setOperation("1");u.setPassword(newString(jp2_jpf.getPassword()));if(qqClientUser.checkUser(u)){下面是发送一个要求返回在线好友的请求的包,创建好友列表的代码:try{QqFriendListqqList=newQqFriendList(u.getQum());ManageQqFriendList.addQqFriendList(u.getQum(),qqList);ObjectOutputStreamoos=newObjectOutputStream(ManageClientConServerThread.getClientConServerThread(u.getQum()).getS().getOutputStream());以下代码是做一个Message信息包:Messagem=newMessage();m.setMessType(MessageType.message_get_onLineFriend);下面的代码指明我要的是这个qq号的好友情况:m.setSender(u.getQum());oos.writeObject(m);36 }catch(Exceptione1){e1.printStackTrace();}同时关闭掉登陆界面关键代码如下:this.dispose();}else{JOptionPane.showMessageDialog(this,"用户名或密码错误",JOptionPane.WARNING_MESSAGE);}}elseif(e.getSource()==jp1_jb2){newRegister();}}}}(1)服务端代码这些代码被写在了一个线程publicclassServerThreadextendsThread中,这样服务器就可以不停的监听端口,接收来自不同客户端的请求,建立socket连接,也不会堵塞在主线程当中,服务器端接收用户验证信息的关键代码如下:从数据库中搜索好友的关键代码如下:publicbooleanCheckUser(Useru){booleanb=false;Stringsql="select*frompersonalinfowhereqnum=?andpassword=?";String[]paras=newString[2];paras[0]=u.getQum();paras[1]=u.getPassword();if(newSqlHelper().SqlQuery(sql,paras)){b=true;}returnb;}2>登陆界面登陆界面的实现比较简单,是Jlabel,JtextFeild,Jpanel等控件的集合,当注册完成之后,通过自己的账号名和密码来进行登录该系统。如图5-4所示。36 图5-4登陆界面1.1聊天模块1>流程图用户点击好友列表弹出聊天窗口,然后输入聊天信息,好友接受到聊天信息后发送回复信息,双方发送的聊天信息将同时显示在自己的聊天窗口中。流程图如图5-5所示。图5-5聊天模块流程图36 1>关键代码(1)客服端代码当用户点击发送按钮后,先把先把信息显示在自己的聊天窗口上,后方发送信息,自己发送的信息和接收到的信息用不同的颜色显示,显示文字信息,显示在JtextPane控件中。当发送消息的时候将消息封装在message包中,并且设置message的各个属性,然后通过objectOutputStream对象发送给服务器,这是监听发送按钮响应事件的代码:publicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubif(e.getSource()==jb){Messagem=newMessage();m.setMessType(MessageType.message_comm_mes);m.setSender(this.ownerId);m.setGetter(this.friendId);m.setConn(jtf.getText());m.setSendTime(newjava.util.Date().toString());以下是发送给服务器信息的关键代码:try{ObjectOutputStreamoos=newObjectOutputStream(ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream());oos.writeObject(m);}catch(Exceptionb){b.printStackTrace();}Stringinfo1=m.getSender()+"对"+m.getGetter()+""+m.getSendTime()+" "+m.getConn()+"r ";this.jta.append(info1);this.jtf.setText("");}}(2)服务端代码将客户端连接服务器的线程封装在MAP中,然后通过ManageClientThread方法得到不同的客户端线程,以下是取的接受者线程并转发信息的关键代码:if(m.getMessType().equals(MessageType.message_comm_mes))36 {SerConClientThreadsc=ManageClientThread.getClientThread(m.getGetter());ObjectOutputStreamoos=newObjectOutputStream(sc.s.getOutputStream());oos.writeObject(m);}1>聊天界面双击好友头像,就会显示和好友聊天的对话框,然后输入聊天信息,可同时支持一人对多人的聊天,不会出现信息发送错误的提示。如图5-6所示。图5-6聊天界面1.2添加删除好友模块1>流程图用户可以点击添加和删除好友,通过输入账号来修改数据库的好友信息表,达到删除和增加好友的目的。如图5-7所示。36 图5-7添加/删除好友流程图1>关键代码当客户登陆到系统后通过点击添加或者是删除按钮就会弹出一个输入好友账号的提示框,然后输入好友的账号进行添加或者删除。将好友账号封装为friendId创建qqClientUser对象,设置User的属性便于在服务器端进行识别,进行不同的操作,以下是是读取数据库信息并添加好友的关键代码:if(e.getSource()==jphy_jb4||e.getSource()==jpmsr_jb4||e.getSource()==jphmd_jb4){StringfriendId=JOptionPane.showInputDialog("请输入要添加好友的QQ号码:");QqClientUserqqClientUser=newQqClientUser();Useru=newUser();u.setOperation("2");u.setQum(owner);u.setFriendId(friendId);if(qqClientUser.Sql(u)){JOptionPane.showMessageDialog(this,"添加成功",JOptionPane.INFORMATION_MESSAGE);}else{36 JOptionPane.showMessageDialog(this,"添加失败",JOptionPane.WARNING_MESSAGE);}}elseif(e.getSource()==jphy_jb5||e.getSource()==jpmsr_jb5||e.getSource()==jphmd_jb5)以下是删除好友的关键信息:{StringfriendId=JOptionPane.showInputDialog("请输入要删除好友的QQ号码:");QqClientUserqqClientUser=newQqClientUser();Useru=newUser();u.setOperation("2");u.setQum(owner);u.setFriendId(friendId);u.setOperation("4");if(qqClientUser.Sql(u)){JOptionPane.showMessageDialog(this,"删除成功",JOptionPane.INFORMATION_MESSAGE);}else{JOptionPane.showMessageDialog(this,"删除失败",JOptionPane.WARNING_MESSAGE);}1>添加好友界面图5-8添加好友界面236 1研究结论1.1总结自从互联网出现以后,就开始在人们的方方面面发挥着不可估计的作用,改变着人们的生活方式。即时通信最大的优点是方便快捷,最基本的功能就是通过计算机之间交换文本数据来实现跨空间的远距离沟通,创建了一种快速的、廉价的、简便的沟通方式。随着互联网技术的不断发展,新的应用,新的技术不断出现,即时通讯系统就是随着互联网的诞生而出现的一种便民应用,其主要作用是聊天,但是本系统主要供局域网内部通讯使用。系统已经在Eclipse开发平台上使用Java语言实现,通过功能测试,可行性已经得到了证明。本论文主要完成以下工作:1>对系统的可行性进行分析,包括技术可行性、经济的可行性、操作的可行性等,同时也进行了系统的需求分析,制作了系统需求列表。2>进行了系统的设计,包括数据库概要设计,系统模块设计,中间包括功能模块图,系统用例图和系统类的设计等等3>对聊天系统进行了实现,其中包括注册、登陆、聊天、添加和删除好友模块模块的流程图,关键代码,和界面等内容最后,实现这个聊天系统的过程中遇到了很多困难,尤其是不知道如何实现多进程之间的通信,但是通过从网上查找资料和询问老师同学,最终解决了这个难点。经过这几个月的钻研和学习,最终完成了该聊天系统的大部分工作,尤其实现了主要功能聊天,为自己在软件设计和开发方面的积累了宝贵的经验和教训。1.2展望1>目前已实现的系统处在一个初步阶段,有些功能还要不断的完善,比如可以在后台服务器对用户进行管理,利用FileOutputStream和FileInputStrem来进行本地聊天信息的保存。2>界面设计还不够吸引用户,比如好友列表界面只显示好友虚拟账号,添加和删除好友的界面太过简单,可以利用JList和模式识别来进动态的查询好友情况显示在列表中进行添加和删除。3>本系统可以进一步由B/S模式升级为点对点通信,也就是说通信的信息不再经过服务器,而直接在客户端和客户端之间进行通信,该通讯模式的实现可以通UTP/TCP打洞技术来实现。36 参考文献[1]张永强.JAVA程序设计教程[M].北京:清华大学出版社,2010.10[2]郭峰.深入浅出设计模式[M].北京:中国铁道出版社,2013.01[3]IanSommerville著.程成等译.软件工程(原书第9版)[M].北京:机械工业出版社,2011.05[4]萨师煊.数据库系统概论[M].北京:高等教育出版社.2010.[5]Baron王小东.高性能MySQL[M].北京:电子工业出版社,2010.02[6](美)布奇等,邵维忠等.UML用户指南(第二版.修订版)[M].北京:人民邮电出版社,2013.01[7]李刚.高性能MySQL[M]疯狂JAVA讲义(第二版).北京:电子工业出版社,2012.01[8]郇战.基于JAVA的多平台聊天系统[J].福建电脑,2008,01:124+137.[9]汪桃华,宋兵,万方基于java的局域网聊天系统[J].内江师范学院学报,2008,S1:242-245.[10]张红霞,陈鸿星.基于Java网络聊天系统的设计与实现[J].科技信息,2014,04:150-151.[11]李丹,张师毅.基于JAVA的仿QQ聊天系统的设计[J].微型机与应用,2013,24:11-13.[12]施滔滔,郭姝,崔晓鹏,刘颖.基于Java平台的网络聊天系统的设计与实现[J].电脑知识与技术,2009,26:7415-7416.[13]闫海波.网络即时通讯软件的设计与实现[D].沈阳工业大学,2008.[14]徐胜昭.基于C/S模式的局域网络聊天软件系统的设计与实现[D].电子科技大学,2012.[15]刘邦桂,李正凡.用Java实现流式Socket通信[J].华东交通大学学报,2007,05:110-112.36 致 谢在毕业论文即将结束的时候,我特别感谢我的指导老师师文老师。无论在我考研还是实训期间,他始终关心着我的论文进展情况,并随时解答我关于论文设计的一些疑惑,尤其在得知我即将为实训付一大笔费用时,时常关心着我的生活和经济上的困难,在此我要向他致以最真诚的敬意。其次,还要感谢我的同学们和朋友们,在毕业设计期间,遇到问题时他们总能帮我一起分析问题、解决问题,有了他们的帮助,我才能克服各种困难,顺利完成毕业设计和论文,最重要的是使我学到了很多实用的技术,在实际工作中受益匪浅,在这里一并向他们表示感谢!最后,我要感谢我的家人,尤其在我考研失败后,给我的精神上的支持,让我充满信心地完成我的学业,完成我的毕业设计。在大学即将结束的时候,我感谢我的母校,在这里我度过了最美好的大学四年,给我留下了最美好的人生回忆,无论以后我将要去那,都不会忘记母校的同学,母校的老师和这里的美好。论文的结束,也就意味着我的大学生活的结束。时光荏苒,四年的大学生活一定会是我人生中最美好的四年,最美的青春回忆。回想起大学的老师们,大学的同学们,是他们的教导和陪伴,才使我有了足够的勇气和能力去面对未来,面对竞争日益激烈的明天。在这里,我要感恩每一位师长,感恩每一位同学,真心祝愿我的老师们和同学们身体健康,生活幸福。36

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭