基于cs架构的JAVA网络聊天系统的设计与实现 毕业论文.doc_第1页
基于cs架构的JAVA网络聊天系统的设计与实现 毕业论文.doc_第2页
基于cs架构的JAVA网络聊天系统的设计与实现 毕业论文.doc_第3页
基于cs架构的JAVA网络聊天系统的设计与实现 毕业论文.doc_第4页
基于cs架构的JAVA网络聊天系统的设计与实现 毕业论文.doc_第5页
免费预览已结束,剩余29页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号2009110121 河 南 警 察 学 院毕 业 论 文(设计)系 别 信息系 专 业 计算机网络安全监察 年 级 2009 姓 名 张宁 论文(设计)题目 基于c/s架构的 java网络聊天系统 指导教师 讲师 2012年5月 4日目 录摘要.1关键词.1abstract.2key words.21.引言.31.1开发背景.61.2开发目的和意义.61.3论文研究内容.72.即时通讯系统的相关研究.72.1 c/s开发模式.72.2即时通讯原理.82.3 socket通信技术83.系统分析.93.1系统基本功能描述.93.2可行性分析.93.3系统需求分析.103.3.1功能分析.104.系统设计.114.1数据库设计114.2数据库模块设计124.2.1聊天系统工作原理图.124.2.2系统功能模块图134.2.3系统用例图134.2.4活动图.144.3系统类设计.165.系统实现.175.1实现概况.175.2注册模块.185.2.1流程图185.2.2关键代码185.3登录模块.205.3.1流程图205.3.2关键代码205.4聊天模块.235.4.1流程图235.4.2关键代码235.5文件模块.245.5.1流程图245.5.2关键代码255.6用户管理模块.265.6.1流程图.265.7用户/服务器界面的设计.275.8结语.30基于c/s架构的java网络聊天系统的设计与实现摘 要网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有netmeeting、腾讯qq、msn-messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如tcp/ip协议、客户端/服务器端模式(client/server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该聊天工具采用eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统。关键词:即时通讯系统 c/s socket swingthe design and implementation of instant messaging systemabstractalong with the fast development of internet, the network chating tool has already become one kind of important communication tools and received more and more web cams favor. at present, many extremely good chating tools have appeared . for example, netmeeting, qq, msn-messager and so on. this system development mainly includes two aspects of the server procedure of the network chat and the customer procedure of the network chat. the former establishes the server through the socket, the server can read and deliver the information which client side sends, and can renovate the users tabulation. the latter make a connection with the server, carries on communication between the client side and the client side. with the lan correspondence mechanism principle, through inheritting the thread kind to establish the multithreading directly. in the development, it uses the elementary theory knowledge which the computer network programmes. for example, tcp/ip agreement, client/server pattern, network programming design method and so on. in the network programming, it realizes reading and transmission of the information, that is,informaton flows realize the information exchange, introduce information flow analysis for realizing a system, in which containes some basic software engineering methods. after analyzes these situations, this chating tool takes eclipse as the basic development environment and compiles in java language. first, it will establish the system application prototype in a short time. then, for the initial prototype system, it needs constantly revised and improved, until a viable system.keywords: instant messaging system; c/s ;socket; swing;1.引言1.1 开发背景随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有netmeeting、腾讯qq、msn-messager等等。无论是个人还是企业等组织机构,对沟通的需求也在不断发展,传统的电话、传真、邮件等沟通方式显然已无法满足当今人们工作和生活沟通的需要。随着软件、网络和通讯三大现代信息技术的发展,在沟通、协作方面有着更多方便、快捷、实时等优势的即时通讯,成为继电话、e-mail之后又一个完全融入每个人生活的互联网工具。java是一个由sun公司开发而成的新一代编程语言。使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种www浏览器,哪一种计算机,哪一种操作系统,只要www浏览器上面注明了“支持java”,你就可以看到生动的主页。java正在逐步成为internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自pc机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。1.2 开发目的和意义网络通信在当今信息社会中起着不可或缺的作用,人们可以利用网络通信技术进行即时的信息 交流。比如说qq聊天工具,它就是利用网络通信技术开发的一款众所周知的网络聊天工具。通讯工具最初虽为聊天而诞生,但其作用早已超出了聊天的范畴,随着企业即时通讯工具的出现,即时信息在网络营销中将发挥更大的作用。目前,信息交流是互联网提供的主要内容,网络通信系统有多种实现方 式,类似icq属于一种点对点的聊天系统;还有一种是基于socket的集中式聊天系统,这种聊天系统需要登录统一的聊天服务器。考虑到要可以在局域网中应用,本系统使用的是第二种方法,经过设置,在局域网或internet上都可以使用。1.3 论文研究内容1、即时通讯原理 首先验证登陆,如果成功,则建立与服务端的socket连接,服务端新开启一个线程专门为它服务,将打包好的message发送给服务器端,服务器端根据message里面的信息,再将信息转发给其他用户。一个标准的c/s模式。2、swing技术 swing是一个用于开发java应用程序用户界面的开发工具包。它以抽象窗口工具包(awt)为基础使跨平台应用程序可以使用任何可插拔的外观风格。用来实现客服端的界面设计。3、系统的构建 客户端采用c/s结构,以io流的读写方式作为数据库。使用户信息以规定的格式在本地持久化存储。2.即时通讯系统的相关研究2.1 c/s开发模式 c/s结构的优点是能充分发挥客户端pc的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个: 而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。 客户端需要安装专用的客户端软件。首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。(大多数没法自动升级而需要人工升级) 对客户端的操作系统一般也会有限制。可能适应于win7,但不能用于windows 2000或windows xp。或者不适用于微软新的操作系统等等,更不用说linux、unix等。2.2 即时通讯原理 登陆进入聊天软件后,即显示出好友列表,在线的显示亮头像,不在线的显示灰色头像。双击好友头像即会显示出聊天界面。在聊天页面上,有发送文字,发送截图,和发送文件的功能按钮。点击“发送”按钮之后,程序就会把输入的信息的种类,信息内容、本人的id号、对方的id号以及当前的时间等内容打包成一个message对象通过socket发送到服务器端。服务器接收到message之后,按照协议进行解析和转发。这样,双方的即时通讯就实现了。2.3 socket通信技术socket程序的工作过程:1、建立socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。2、数据通信:利用虚拟连接通道传送数据信息进行通信。3、关闭:通信结束时,再将所建的虚拟连接拆除。具体如下:服务器 图 2-1 socket通信3.系统分析3.1 系统基本功能描述客户端可以实现注册,即时聊天、在线好友查看、好友上、下线弹出窗口通知、服务器后台系统信息发布,相互之间收发文件等等。还有,收发消息时,可以实现离线接收。服务器端应当建立一个serversocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。3.2 可行性分析本系统的可行性分析包括以下几个方面的内容:(1) 技术可行性使用swing 和socket技术,可以很轻松地开发出实用、简便、高效的基于网络的即时通讯系统。因此技术上是可以实现的。(2) 经济可行性计算机网络已经普及,因此在网络设备上不需要进行大的投入。本系统需要java jre环境,由于并发使用人数比较少,所以成本很低。(3) 操作可行性只要一台以上计算机连接在同一个局域网内,本系统就可以安装使用,所以操作上完全不存在问题。如果要实现internet上通讯,只需要将服务器端运行在一个有固定ip的公网上就可以。综上所述,即时java即时通讯系统是可行的。3.3 系统需求分析3.3.1功能分析本系统要实现的功能如下:1)注册服务器收到用户的注册请求,便开始接受客户传递的信息,诸如客户的呢称,性别,籍贯,个人资料等,接受完毕后,便通过jdbc与后台数据库连接,然后向数据库添加记录,如果成功,便向客户返回其号码。客户收到服务器返回的信息后,便打开窗口登陆。2)登陆在客户端,用户输入其号码和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过jdbc读取数据库,然后与用户输入的信息进行比对,如果成功,便打开主程序窗口。然后客户向服务器请求读取好友名单,服务器收到该请求,从数据库中取出好友列表,然后向客户端发送这些信息,客户收到后就在主窗口显示好友。3)聊天客户端首先发送消息到服务器端,服务器端根据发送人信息和接收者信息来转发。例如服务器接收到一个a发给b的消息,先判断b是否已经在线,如果在线就将信息发送过去。如果b不在线则把信息储存在服务器,等b上线了在发送给他。b接收到a发来的信息,如果是未建立对话窗口,则自动打开显示。4)发送截图客户端a点击截图按钮,将屏幕锁定,截取图片,将图片储存在byte数组中发送到服务器端。服务器端根据发送人信息和接收者信息来转发。b接收到a发来的截图信息,会根据byte构造图片,将图片显示出来。同样,如果是未建立对话窗口,则自动打开显示。5)发送文件客户端a点击发送文件按键,从本地选择文件,将文件在byte数组中分批次发送到服务器端。服务器端根据发送人信息和接收者信息来转发。b接收到a发来的文件信息,会根据文件发送的状态和byte构造文件。6)日志客户端发送和接收到的信息都会储存在文本文档中。默认储存在c盘下面,会以用户的登录账号为名。7)对用户的操作 管理员通过b/s的系统对用户进行增加,修改,删除,查找等操作,对系统进行维护。8)在线用户的操作 管理员通过b/s的系统对在线用户操作,可以踢用户下线。4.系统设计4.1 数据库设计本系统中所涉及的主要实体及其属性有:用户(用户账号,用户名,密码,个性签名,头像id,年龄,性别) e-r模型如图所示。图 4-1系统实体及其属性表4-1 user字段名数据类型字段说明键引用备注accountint(6)idpk主键(自动增一)namevarchar(20)用户名称非空passwordvarchar(20)用户密码非空signaturevarchar(255)签名profileidint(2)头像idageint(3)年龄sexsex char(2)性别4.2 系统模块设计4.2.1 聊天系统工作原理图 图 4-2 系统工作原理4.2.2 系统功能模块图:图 4-3 系统模块4.2.3 系统用例图:普通用户的用例图:图 4-4 普通用户用例图4.2.4 活动图:1)用户登陆活动图首先填写登陆信息,提交以后服务器会对用户名和密码进行验证。如果不正确,返回一个提示信息。如果登陆成功,就更新在线状态。通知所有好友自己已经上线。服务器再检查是否有他的离线消息,如果有这立即发送给用户。图 4-6 用户登录活动图2)发送消息活动图短消息发送以后,服务器端对应的监听线程会接收到一个数据包。此包中包含接收者的信息,如果接收者在线,数据包将会转发到接收者。如果不在线,存在服务器端,等它上线在发送。图 4-7发送消息活动图4.3 系统类设计4.3.1 服务端线程的设计:服务器端的核心是对应客户的线程,每个socket对应一个线程,也就是每一个客户端都在服务器端有一个相应的线程。它负责转发客户端发来的消息。线程类为clientthread:表4-3 clientthread类属性名作用public void notifyonline()通知其他线程,自己上线了,让客户方更新头像public void run() 线程的主题,转发消息public void notifyoffline()通知其他线程,自己下线了,让客户方更新头像public void send(object o) 发送消息public object receive() 接收消息4.3.2 客户端线程类设计属性名作用public int login (string username,string password)传入帐号密码给服务器端验证public void run() 线程的主题,读取服务器端发来的资料并显示相关内容public void sendmsg2server(bytedata)向服务器端发送信息public void sendcheckmsg2server()向服务器发送确认信息,确保链路通畅public void monitorthread()检测连接状态,确保链路通畅5.系统实现5.1 实现概况本系统可分为登录、聊天、文件、用户管理和注册五个功能模块。“登录”模块为用户提供登录界面,并在用户登录显示好友列表;“聊天”模块实现用户的即时传送信息,即多用户即时聊天,可以发送文字;“文件”模块主要实现一用户向另一用户发送文件,对方可以选择接受或者拒绝。聊天记录会以文本文档格式保存。下面详细介绍各个模块的具体实现。5.2 注册模块5.2.1 流程图图 5-1 用户注册流程图5.2.2 关键代码public class regist private socket socket = null;private outputstream os ; private dataoutputstream dos;private datainputstream dis;private registmsg rm;private int answer=-1;public void setanswer(int answer) this.answer = answer;public int getanswer() return answer;public regist(registmsg rm)try socket rs = new socket(,9999);this.socket=rs;this.rm=rm;system.out.println(client: +new dateprocess().lprocess()+ 成功链接到服务器.); catch (unknownhostexception e) system.out.println(client: +new dateprocess().lprocess()+ 未知的服务器链接.); catch (ioexception e) system.out.println(client: +new dateprocess().lprocess()+ 读写错误或者服务器未开启.);/注册方法public int regist(registmsg rm) throws exceptioninputstream is = socket.getinputstream();os = socket.getoutputstream();dos=new dataoutputstream(os);dis=new datainputstream(is);byte data = new pack().pack(rm) ;system.out.println(sdds+dos);dos.write(data);dos.flush();byte r = new byte4;dis.read(r);string answer = new string(r).trim();return integer.parseint(answer);5.3 登录模块5.3.1 流程图 图 5-3 登录流程图5.3.2 关键代码1)客户端代码string username = name_text.gettext();string password = pwd_text.gettext();system.out.println(username+-+password);if(username=null|.equals(username)|password=null|.equals(password)javax.swing.joptionpane.showmessagedialog(null, 用户名和密码不能为空);return;elseframe.dispose();clientthread client = new clientthread();int result = client.login(username, password);/已经登录if(result=1)javax.swing.joptionpane.showmessagedialog(null, 该用户已经登录);/用户名,密码不匹配else if(result=2)javax.swing.joptionpane.showmessagedialog(null, 用户名和密码不匹配);/登录成功else if(result=0)/将该用户添加到clienttools里面clienttools.setclient(client);client.start();process = new threadprocess(integer.parseint(username);process.addtray(new systemtraylistener();clienttools.pt=process;process.start();2)服务器端代码:服务器端接收用户验证信息的代码被写在了一个线程public class serverthread extends thread中,这样服务器就可以不停的监听端口,接收来自不同客户端的请求,建立socket连接,也不会堵塞在主线程当中。public socket getclient()return this.client;private int userid;/获得用户idpublic int getuserid() return userid;public void setuserid(int userid) this.userid = userid;如果验证成功,查找是否有他的离线消息,有就发送给他。然后在服务器上专门开启一个针对当前用户的线程,并且吧线程放入管理类中,便于日后的管理。logonmsg lom = new logonmsg();lom.setdest(0);lom.setsource(0);lom.settype(protocol.logon_message);lom.setid(getuserid();lom.settotallen(20);for(int f =1;ffirend.length;f+)for(serverthread st :chattools.onlineuser)if(st.getuserid()=integer.parseint(firendf)st.getdos().write(new pack().pack(lom);st.getdos().flush();system.out.println(server: +new dateprocess().lprocess()+下发一条好友上线信息.); /发送离线消息if(chattools.offlinemsg.size()!=0)for (iterator it = chattools.offlinemsg.iterator();it.hasnext();)messagehead tm = (messagehead)it.next();if(tm.getdest()=getuserid()this.dos.write(new pack().pack(tm);this.dos.flush();it.remove();system.out.println(server: +new dateprocess().lprocess()+下发一条好友留言信息.);5.4 聊天模块5.4.1 流程图图 5-4 聊天流程图5.4.2 关键代码dous.writeint(totallen);dous.writeint(type);dous.writeint(dest);dous.writeint(source);dous.writeint(rm.getuserid();system.out.println(打包时候的userid +rm.getuserid();string temppassword = rm.getpassword();while(temppassword.getbytes().length16)temppassword+=0;string tempnickname = rm.getnickname();while(tempnickname.getbytes().length20)tempnickname+=0;string tempphoto = rm.getphoto();while(tempphoto.getbytes().length256)tempphoto+=0;string tempsign = rm.getsign();while(tempsign.getbytes().length100)tempsign+=0;dous.write(temppassword.getbytes();dous.write(tempnickname.getbytes();dous.write(tempphoto.getbytes();dous.write(tempsign.getbytes();5.5 文件模块5.5.1 流程图图 5-6 发送文件流程图5.5.2 关键代码在客户端采用jfilechooser来浏览本地文件,点击浏览按钮后,会弹出对话框,让用户选择文件,然后将文件名,大小等信息封装在数据包里,发送出去。关键代码如下:if(jlabel)e.getsource().getname().equals(file)jfilechooser jf=new jfilechooser(请选择所要发送的文件); /文件选择器jf.setdialogtitle(请选择文件);int result = jf.showopendialog(null);jf.setvisible(true);if (result = jfilechooser.approve_option) selectedfile = jf.getselectedfile(); if (selectedfile.exists() int len =0; fileinputstream fis; string name = selectedfile.getname(); clientt=name; clienttr.settext(文件传送邀请已经发出,等待对方回应.); clienttools.path=selectedfile.getabsolutepath(); try fis = new fileinputstream(selectedfile);len = fis.available();byte data = new bytelen;fis.read(data); catch (exception e1) e1.printstacktrace();5.6 用户管理模块5.6.1 流程图图 5-10 web用户登录图由于这是后期延伸的项目功能,暂时并没有实现。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论