基于JAVA聊天系统设计的实现

基于JAVA聊天系统设计的实现

ID:20980853

大小:615.00 KB

页数:35页

时间:2018-10-18

上传者:赏心悦目
基于JAVA聊天系统设计的实现_第1页
基于JAVA聊天系统设计的实现_第2页
基于JAVA聊天系统设计的实现_第3页
基于JAVA聊天系统设计的实现_第4页
基于JAVA聊天系统设计的实现_第5页
资源描述:

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

.本科毕业论文基于JAVA的聊天系统的设计与实现学院:机电工程学院专业:计算机科学与技术双学位学号:043545464姓名:指导教师:李美安职称:教授论文提交日期:二ОО八年四月. .摘要随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统关键词:局域网聊天socketjava. .AbstractAlongwiththefastdevelopmentofInternet,thenetworkchatingtoolhasalreadybecomeonekindofimportantcommunicationtoolsandreceivedmoreandmorewebcamsfavor.Atpresent,manyextremelygoodchatingtoolshaveappeared.forexample,Netmeeting,QQ,MSN-Messagerandsoon.Thissystemdevelopmentmainlyincludestwoaspectsoftheserverprocedureofthenetworkchatandthecustomerprocedureofthenetworkchat.TheformerestablishestheserverthroughtheSocket,theservercanreadanddelivertheinformationwhichclientsidesends,andcanrenovatetheuserstabulation.Thelattermakeaconnectionwiththeserver,carriesoncommunicationbetweentheclientsideandtheclientside.WiththeLANcorrespondencemechanismprinciple,throughinherittingtheThreadkindtoestablishthemultithreadingdirectly.Inthedevelopment,itusestheelementarytheoryknowledgewhichthecomputernetworkprogrammes.forexample,TCP/IPagreement,Client/Serverpattern,networkprogrammingdesignmethodandsoon.Inthenetworkprogramming,itrealizesreadingandtransmissionoftheinformation,thatis,informatonflowsrealizetheinformationexchange,introduceinformationflowanalysisforrealizingasystem,inwhichcontainessomebasicsoftwareengineeringmethods.Afteranalyzesthesesituations,thisLANchatingtooltakesEclipseasthebasicdevelopmentenvironmentandcompilesinjavalanguage.first,itwillestablishthesystemapplicationprototypeinashorttime.then,fortheinitialprototypesystem,itneedsconstantlyrevisedandimproved,untilaviablesystem.Keywords:LANChatSocketJava. .目录1.绪论………………………………………………………………………………011.1JAVA的网络功能与编程…………………………………………………011.1.1JAVA概述…………………………………………………………………021.1.2JAVA的特点……………………………………………………………041.1.3JAVA语言在网络上的应用……………………………………………071.2JavaBeans技术……………………………………………………………081.3IP/TCP协议常识…………………………………………………………081.4Socket的简介……………………………………………………………092.规划设计…………………………………………………………………………112.1课题来源……………………………………………………………………112.2需求分析…………………………………………………………………113.系统分析与设计方案……………………………………………………………123.1聊天系统的总体设计要点………………………………………………123.2聊天系统的设计步骤及功能模块划分……………………………………123.3功能模块结构图…………………………………………………………134.系统设计环境与测试…………………………………………………………264.1开发环境和工具…………………………………………………………264.2硬件环境……………………………………………………………………264.3聊天系统的测试…………………………………………………………265.毕业设计总结……………………………………………………………………285.1毕业设计总结和展望……………………………………………………285.2经验和感想…………………………………………………………………28致谢……………………………………………………………………………30参考文献…………………………………………………………………………31. .1绪论随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。1.1JAVA的网络功能与编程1.1.1JAVA概述美国硅谷有一句行话,每10年~15年有一次轮回。最近的一次轮回就是从Java开始。Java是一个由Sun公司开发而成的新一代编程语言。使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种WWW浏览器,哪一种计算机,哪一种操作系统,只要WWW浏览器上面注明了“支持Java”,你就可以看到生动的主页。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。Sun的Java语言开发小组成立于1991年,其目的是开拓消费类电子产品市场,例如,交互式电视、烤面包箱等。Sun内部人员把这个项目称为Green,那时WorldWideWeb还在图纸上呢。该小组的领导人是JamesGosling,是一位非常杰出的程序员。他出生于1957年,于1984年加盟SunMicrosystem公司,之前在一家IBM研究机构工作。他是SunNeWs窗口系统的总设计师。也是第一个用C实现的EMACS的文本编辑器COSMACS的开发者。在研究开发过程中,Gosling深刻体会到消费类电子产品和工作站产品在开发哲学上的差异:消费类电子产品要求可靠性高、费用低、标准化、使用简单,用户并不关心CPU的型号,也不欣赏专用昂贵的RISC处理器,他们需要建立在一个标准基础之上,具有一系列可选的方案,从8086到80586都可以选取。从C开始. .为了使整个系统与平台无关,Gosling首先从改写C编译器着手。但是Gosling在改写过程中感到仅C是无法满足需要的,于是在1991年6月份开始准备开发一个新的语言,那么给它起一个什么名字呢?Gosling回首向窗外望去,看见一棵老橡树,于是建一个目录叫Oak,这就是Java语言的前身(后来发现Oak已是Sun公司另一个语言的注册商标,才改名为Java,即太平洋上一个盛产咖啡的岛屿的名字)。Gosling在开始写Java时,并不局限于扩充语言机制本身,更注重于语言所运行的软硬件环境。他要建立一个系统,这个系统运行于一个巨大的、分布的、异构的网格环境中,完成各电子设备之间的通信与协同工作。Gosling在设计中采用了虚机器码(VirtualMachineCode)方式,即Java语言编译后产生的是虚拟机,虚拟机运行在一个解释器上,每一个操作系统均有一个解释器。这样一来,Java就成了平台无关语言。这和Gosling设计的SunNeWs窗口系统有着相同的技术味道。在NeWs中用户界面统一用Postscript描述,不同的显示器有不同的Postscript解释器,这样便保证了用户界面的良好的可移植性。PatrickNaughton也是Sun公司的技术骨干,曾经是OpenWindows项目的负责人。当Naughton加入该小组后,整个工作进展神速。经过17个月的奋战,整个系统胜利完成。它是由一个操作系统、一种语言(Java)、一个用户界面、一个新的硬件平台、三块专用芯片构成的。通常情况下,这样的项目在Sun公司要75个人干三年。项目完成后,在Sun公司内部做了一次展示和鉴定,观众的反应是:在各方面都采用了崭新的、非常大胆的技术。许多参观者对Java留下了非常深刻的印象,特别得到Sun的两位领导人ScottMcNealy和BillJoy的关注,但Java的前途未卜。Java语言的转折点  到了1994年,WWW已如火如荼地发展起来。Gosling意识到WWW需要一个中性的浏览器,它不依赖于任何硬件平台和软件平台,它应是一种实时性较高、可靠安全、有交互功能的浏览器。于是Gosling决定用Java开发一个新的Web浏览器。  这项工作由Naughton和JonathanPayne负责,到1994年秋天,完成了WebRunner的开发工作。WebRunner是HotJava的前身,这个原型系统展示了Java可能带来的广阔市场前景。WebRunner改名为HotJava,并于1995年5月23日发表后,在产业界引起了巨大的轰动,Java的地位也随之而得到肯定。又经过一年的试用和改进,Java1.0版终于在1996年年初正式发表。Java带来的影响  Java虽出现的时间不长,但已被业界接受,IBM、Apple、DEC、Adobe、SiliconGraphics、HP、Oracle、Toshiba、Netscap和Microsoft等大公司已经购买了Java的许可证。Microsoft还在其Web浏览器Explorer3.0版中增加了对Java的支持。. .  另外,众多的软件开发商也开发了许多支持Java的软件产品。如:Borland公司的基于Java的快速应用程序开发环境Latte;Metrowerks公司和NaturalIntelligence公司分别开发的基于Machintosh的Java开发工具;Sun公司的Java开发环境JavaWorkshop;Microsoft也开发出系列Java产品。数据库厂商如Illustra,Sybase,Versant,Oracle都在开发支持HTML和Java的CGI(CommonGatewayInterface)。在以网络为中心的计算时代,不支持HTML和Java,就意味着应用程序的应用范围只能限于同质的环境。  Intranet正在成为企业信息系统最佳的解决方案。它的优点表现在:便宜、易于使用和管理。用户不管使用何种类型的机器和操作系统,界面是统一的Web浏览器,而数据库、Web页面、应用程序(用Java编的applet)则存在WWW服务器上。开发人员只需维护一个软件版本,管理人员省去了为用户安装、升级、培训之苦,用户则只需一个操作系统,一个Internet浏览器足矣。  我们可以设想未来的计算方式,每个HomePage的实质是一个多媒体应用程序,这些程序用Java来开发。Java应用程序运行在异质的机器、异质的操作系统之上,甚至于电冰箱、烤面包箱、防盗电子设备之中,用Internet把所有的电子设备连接起来,通过TCP/IP进行信息的交流。Java应用程序之间既可以交换消息,也可以交换程序(一个Java的小应用程序applet)。或许有一天,我们可以在Netscape浏览器里查看电冰箱的温度,向烤面包箱发一个电子邮件。  Java的出现是计算机信息交换的一个重要里程碑。在单机时代,程序进程之间靠共享存储进行变量交换;在网络时代,运行在不同宿主机上的程序按网络协议进行无格式的消息(二进制字符流)交换,消息的语义由交换程序双方维护;在Java时代,运行在网络上的程序进程交换的是小应用程序(applet)。小应用程序是什么?它是一个对象,由一组属性和方法构成,是一个可执行的实体;不仅有数据的状态,而且有定义在数据上的操作。未来可能进行代表(Agent)交换,代理有一定的智能性,那便是信息交换的更高级阶段。  随着Internet的崛起、Java的诞生,巨型的、臃肿的应用软件开始向小型化发展,由众多“生活”在Internet上的小应用程序(applet)相互协作完成信息的处理与传递。Java会加速应用软件的小型化、网络化的趋势。随着Internet的发展,软件必然是面向“大众”,而不是“少数人”的奢侈品,薄利多销将是网络应用软件的重要特点。分布式对象技术保证了用多少,下载多少。Java连同Internet,WWW正在改变应用软件的开发和使用方式,一切都要围绕着网络,围绕着平台无关。很多人认为,Word、Excel等传统的信息处理工具都必然走向萎缩,因为它们是单机时代的产物。信息的价值在于使用和共享,Internet和Web是信息的使用和共享最快捷、最便宜的方式,Word将演化成为Web写作工具,Excel则将演化成Web上的电子表格。1.1.2JAVA的特点(一)JAVA的主要特点. .Java语言有下面一些特点:简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。1.简单性Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。Java略去了运算符重载、多重继承等模糊的概念,,且通过实现自动垃圾收集大大简化了程序设计者的内存管理工作。另外,Java也适合于在小型机上运行,它的基本解释器及类的支持只有40KB左右,加上标准类库和线程的支持也只有215KB左右。库和线程的支持也只有215KB左右。2.面向对象Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。3.分布性Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其它对象。4.鲁棒性Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。5.安全性用于网络、分布环境下的Java必须要防止病毒的入侵。Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。6.体系结构中立Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平台运行。7.可移植性与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。. .同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java系统本身也具有可移植性。8.解释执行Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。9.高性能和其它解释执行的语言如BASIC不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。10.多线程多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。11.动态性Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。(二)JavaAppletJava语言的特性使它可以最大限度地利用网络。Applet是Java的小应用程序,它是动态、安全、跨平台的网络应用程序。JavaApplet嵌入HTML语言,通过主页发布到Internet。网络用户访问服务器的Applet时,这些Applet从网络上进行传输,然后在支持Java的浏览器中运行。由于Java语言的安全机制,用户一旦载入Applet,就可以放心地来生成多媒体的用户界面或完成复杂的计算而不必担心病毒的入侵。虽然Applet可以和图像、声音、动画等一样从网络上下载,但它并不同于这些多媒体的文件格式,它可以接收用户的输入,动态地进行改变,而不仅仅是动画的显示和声音的播放。(三)丰富的类库Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。1.语言包提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。2.实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。3.输入输出包用统一的"流"模型来实现所有格式的I/O,包括文件系统、网络、输入4.低级网络包用于实现Socket编程。5.抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,. .包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。6.网络包支持Internet的TCP/IP协议,提供了与In-ternet的接口。它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。(四)Java和C、C++对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时,Java为了实现其简单、鲁棒、安全等特性,也摒弃了C和C++中许多不合理的内容。1.全局变量Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。例如:ClassGlobalVar{publicstaticglobal_var;}在类GlobalVar中定义变量global_var为publicstatic,使得其它类可以访问和修改该变量。Java对全局变量进行了更好的封装。而在C和C++中,依赖于不加封装的全局变量常常造成系统的崩溃。2.GotoJava不支持C、C++中的goto语句,而是通过例外处理语句try,Catch,final等来代替C、C++中用goto来处理遇到错误时跳转的情况,使程序更可读且更结构化。3.指针指针是C、C++中最灵活,也是最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,造成系统的崩溃。而Java对指针进行完全的控制,程序员不能直接进行任何指针操作,例如把整数转化为指针,或者通过指针释放某一内存地址等。同时,数组作为类在Java中实现,良好地解决了数组访问越界这一C、C++中不作检查的错误。4.内存管理在C中,程序员通过库函数malloc()和free()来分配和释放内存,C++中则通过运算符new和delete来分配和释放内存。再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。而在Java中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过new得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,Java对此自动地进行管理并且进行垃圾收集,有效防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。5.数据类型的支持在C、C++中,对于不同的平台,编译器对于简单数据类型如int,float等分别分配不同长度的字节数,例如:int在IBMPC中为16位,在VAX-11中为. .32位,这导致了代码的不可移植性,但在Java中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了Java的平台无关性。6.类型转换在C、C++中,可以通过指针进行任意的类型转换,常常带来不安全性,而Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。7.头文件C、C++中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。而Java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。同时,Java中用import语句来与其它类进行通讯,以便使用它们的方法。8.结构和联合C、C++中的结构和联合中所有成员均为公有,这就带来了安全性问题。Java中不包含结构和联合,所有的内容都封装在类中。9.预处理C、C++中用宏定义来实现的代码给程序的可读性带来了困难。在Java中不支持宏,它通过关键字final来声明一个常量,以实现宏定义中广泛使用的常量定义1.1.3JAVA语言在网络上的应用Java程序可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。例如Java程序可以每隔一定时间读取某结点提供的最新数据,并以图表的形式显示出来。在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法(method)获取该对象所代表的资源。下面列举一个Java从网络上获取图象的的方法以说明。JavaApplet可以直接从网络上结点获取图象并显示出来,Java提供了如下方法可以创建对应于其他结点的图象:getImage(newURL(字符串))其使用格式可有两种:Stringurl=“结点URL”;Imageimage;try{image=getImage(newURL(url));}catch(Exceptione){System.out.println(“Can’topentheURL“);}. .或URLimgur=null;Imageimage;try{imgur=newURL(“结点URL“);}catch(MalformedURLExceptione){System.out.println(“Can’topentheURL“);}image=getImage(imgur);前一种格式用“newURL(url)”生成URL对象,并直接作为getImage的参数,后一种格式先用“newURL(url)”生成一个URL对象,再传给getImage,两种格式本质上是一样的。以上仅是Java在客户端应用的一些方面,目前,Java更广泛的应用是在服务器端。1.2JavaBeans技术什么是JavaBeans?JavaBeans就是Java的可重用组件技术。ASP通过COM来扩充复杂的功能,如文件上载、发送email以及将业务处理或复杂计算分离出来成为独立可重复利用的模块。JSP通过JavaBeans实现了同样的功能扩充。JSP对于在Web应用中集成JavaBeans组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性。JavaBeans组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据提取等。在实际的JSP开发过程中,读者将会发现,和传统的ASP或PHP页面相比,JSP页面将会是非常简洁的,由于JavaBeans开发起来简单,又可以利用Java语言的强大功能,许多动态页面处理过程实际上被封装到了JavaBeans中。1.3IP/TCP协议常识(1)IP、TCP协议的特点:TCP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议/网际协议的缩写,TCP/IP是当今网络互联的核心协议。TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。. .IP协议的作用:第一,它是网络层的协议,提供互联网上数据传输的统一格式。第二,提供不可靠的无连接的服务。第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。TCP协议的功能:差错控制——可靠性、面向连接、分段(Segment)、端口号。TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑动窗口机制来保证传输的可靠性,及进行流量控制。TCP/IP协议具有以下特点:1、协议标准具有开放性,其独立于特定的计算机硬件及操作系统,可以免费使用。2、统一分配网络地址,使得每个TCP/IP设备在网络中都具有唯一的IP地址。3、实现了高层协议的标准化,能为用户提供多种可靠的服务。(2)TCP/IP协议进行传输数据传输的过程:应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP数据包封装在IP包内,通过网络送给目的TCP。接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,向TCP提供所有TCP需要的服务。(3)端口号:有的时候,一个ip地址不能完整的标识一台服务器,这是应为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是端口。端口实际是一个16位长的地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都只道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的个客户端应用程序。在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端。1.4Socket的简介Socket,简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。. .具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个socket建立连接,客户端通过写socket来通知服务器,以读socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个socket,通过读写和客户端通信。Socket程序的工作过程:1、建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。2、数据通信:利用虚拟连接通道传送数据信息进行通道。3、关闭:通信结束时,再将所建的虚拟连接拆除。具体如下:服务器1服务器socket2监听4接收5读6写7关闭3客户端etsocket6写5读7关闭三次握手:第一次握手:原主机发送一个带有本次连接的序号的请求的一个数据帧第二次握手:目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。第三此握手:源端机收到含有两次初始序列号的应答后,在向目的主机发送一个带有两次连接的序列号的确认。具体过程如下ACK=1第一次握手,主机A向主机B发送连接请求第二次握手,主机B收到主机A的请求,向主机A回发一个确认,,同时向主机A发送一个连接请求第三次握手,主机A收到主机B发送的数据包在向主机B发送一个确认连接主机A主机B. .ACK=1,SYN=1,SEQ=aaaaaaaaaaSYN=1,SEQ=2规划设计2.1课题来源根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《基于JAVA聊天设计与实现》为毕业设计,希望通过这一次的能进一步提高本人的网络开发编程的能力。2.2需求分析聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务:  1.服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。  2.服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。  以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。  客户端应该完成的工作包括:  1.与服务器端建立通信通道,向服务器端发送信息。  2.接收来自服务器的信息。  相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。3系统分析与设计方案3.1聊天系统的总体设计要点. .聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:1、实现思想在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。2、服务器端工作流程服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。3、客户端工作流程客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。3.2聊天系统的设计步骤及功能模块划分聊天系统工作原理图3.3聊天系统各功能模块. .(1)服务器程序模块服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。服务器线程源码:packageqq.server;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.net.Socket;importjava.util.*;importqq.dao.hibernate.IServiceDao;importqq.entity.*;publicclassServerController{privateUseruser;privateSockets;privateIServiceDaodao;privateObjectInputStreamois;privateObjectOutputStreamoos;privateOnlineUseronlineUser;publicServerController(Sockets){super();dao=ServerMainClass.userDao;this.s=s;}publicvoidhandle()throwsException{ois=newObjectInputStream(s.getInputStream());. .oos=newObjectOutputStream(s.getOutputStream());onlineUser=newOnlineUser(ois,oos);while(true){Requestreq=(Request)ois.readObject();ois.read();RequestTypetype=req.getType();if(type.equals(RequestType.exit)){exitHandle();break;}elseif(type.equals(RequestType.login)){loginHandle(req);}elseif(type.equals(RequestType.register)){registerHandle();}elseif(type.equals(RequestType.offline)){offlineHandle();break;}elseif(type.equals(RequestType.changeInformation)){changeInformationHandle();}elseif(type.equals(RequestType.modifypasswd)){modifypasswdHandle(req);}elseif(type.equals(RequestType.sendMessage)){sendMessageHandle(req);}elseif(type.equals(RequestType.receiveFile)){receiveFileHandle(req);}elseif(type.equals(RequestType.sendFile)){sendFileHandle(req);}}}privatevoidmodifypasswdHandle(Requestreq){Longid=Long.parseLong(req.getData("id"));Stringoldpwd=req.getData("oldpwd");Stringnewpwd=req.getData("newpwd");Responseres=newResponse(RequestType.modifypasswd);. .try{dao.updatePwd(id,oldpwd,newpwd);res.setData(1);try{oos.writeObject(res);}catch(IOExceptione){e.printStackTrace();}}catch(RuntimeExceptione){try{oos.writeObject(res);}catch(IOExceptione1){e1.printStackTrace();}}}privatevoidchangeInformationHandle(){try{Useruser=(User)ois.readObject();Responseres=newResponse(RequestType.changeInformation);try{dao.updateUser(user);res.setData(1);//修改成功返回值带一个整形值oos.writeObject(res);oos.flush();}catch(RuntimeExceptione){oos.writeObject(res);//失败则返回值不带参数oos.flush();e.printStackTrace();}}catch(IOExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){. .e.printStackTrace();}}privatevoidexitHandle(){try{s.close();}catch(IOExceptione){e.printStackTrace();}}//发送文件privatevoidsendFileHandle(Requestreq){//try{//Useru=(User)ois.readObject();////}catch(Exceptione){//e.printStackTrace();//}}//接受文件privatevoidreceiveFileHandle(Requestreq){}//发送消息privatevoidsendMessageHandle(Requestreq){Responseres=newResponse(RequestType.receiveMessage);Messagemessage=null;try{message=(Message)ois.readObject();res.setData(message);}catch(IOExceptione){e.printStackTrace();. .}catch(ClassNotFoundExceptione){e.printStackTrace();}Userto=message.getTo();if(to==null){sendToAllUser(res);//如果收信人为null,则发送信息给所有人}else{//发送信息给to和他自己Responseres1=newResponse(RequestType.individualTalk);res1.setData(message);ObjectOutputStreamo=null;Setset=ServerMainClass.userMap.keySet();Iteratorit=set.iterator();while(it.hasNext()){Useru=(User)it.next();if(u.equals(to)){o=ServerMainClass.userMap.get(u).getOos();break;}}try{o.writeObject(res1);o.flush();}catch(IOExceptione){e.printStackTrace();}}}//下线privatevoidofflineHandle(){try{ServerMainClass.userMap.remove(user);Responseres=newResponse(RequestType.offline);res.setData(user);//把下线用户发送给所有客户端. .sendToAllUser(res);s.close();}catch(IOExceptione){e.printStackTrace();}}privatevoidregisterHandle(){Useruser=dao.addUser();try{oos.writeObject(user);System.out.println(user.getId()+":"+user.getName());oos.flush();}catch(IOExceptione){e.printStackTrace();}}//登录privatevoidloginHandle(Requestreq){Longid=Long.parseLong((String)req.getData("id"));Stringpwd=(String)req.getData("pwd");user=dao.getUser(id,pwd);Responseres;try{Setusers=ServerMainClass.userMap.keySet();Iteratoriter=users.iterator();while(iter.hasNext()){Useru=(User)iter.next();if(u.equals(user)){res=newResponse(RequestType.haveOnline);oos.writeObject(res);oos.flush();return;//该用户已经在线}. .}res=newResponse(RequestType.online);res.setData(user);oos.writeObject(res);oos.flush();//给刚上线用户发送在线用户列表if(user!=null){Setset=ServerMainClass.userMap.keySet();oos.write(set.size());Iteratorit=set.iterator();while(it.hasNext()){oos.writeObject(it.next());}oos.flush();sendToAllUser(res);//通知在线用户有新用户上线ServerMainClass.userMap.put(user,onlineUser);//保存用户信息}}catch(IOExceptione){e.printStackTrace();}}privatevoidsendToAllUser(Responseres){try{Collectionc=ServerMainClass.userMap.values();Iteratorit=c.iterator();while(it.hasNext()){ObjectOutputStreamo=((OnlineUser)it.next()).getOos();o.writeObject(res);o.flush();}}catch(IOExceptione){e.printStackTrace();}. .}}(2)客户程序模块客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造ObjectInputStream,ObjectOutputStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如文件传输等,服务器收到来自客户的请求后,针对不同的消息处理请求。具体的源码如下:packageqq.client;importjava.awt.Color;importjava.io.EOFException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjavax.swing.JOptionPane;importjavax.swing.JTextPane;importjavax.swing.text.BadLocationException;importjavax.swing.text.SimpleAttributeSet;importjavax.swing.text.StyleConstants;importjava.net.*;importjava.util.Calendar;importqq.client.panel.UserListPanel;importqq.client.windows.IndividualTalkWindow;importqq.entity.*;publicclassClientThreadextendsThread{privateObjectInputStreamois;privateObjectOutputStreamoos;privateSockets;privateJTextPanereceive;privateJTextPanerecord;privateJTextPanepublicInfo;. .privateUserListPaneluserList;privateSimpleAttributeSetset;publicClientThread(JTextPanereceive,JTextPanerecord,JTextPanepublicInfo,UserListPaneluserList){this.receive=receive;this.record=record;this.publicInfo=publicInfo;this.userList=userList;s=ClientMainClass.socket;ois=ClientMainClass.ois;oos=ClientMainClass.oos;set=newSimpleAttributeSet();StyleConstants.setFontSize(set,16);StyleConstants.setFontFamily(set,"宋体");StyleConstants.setForeground(set,newColor(0,139,139));}@Overridepublicvoidrun(){while(s.isConnected()){try{Responseres=(Response)ois.readObject();if(res!=null){RequestTypetype=res.getType();if(type.equals(RequestType.online)){onlineHandle(res);}elseif(type.equals(RequestType.offline)){offlineHandle(res);}elseif(type.equals(RequestType.changeInformation)){changeInformationHandle(res);}elseif(type.equals(RequestType.modifypasswd)){modifypasswdHandle(res);}elseif(type.equals(RequestType.receiveMessage)){. .receiveMessageHandle(res);}elseif(type.equals(RequestType.individualTalk)){individualTalkHandle(res);}elseif(type.equals(RequestType.receiveFile)){receiveFileHandle(res);}elseif(type.equals(RequestType.publicInfo)){publicInfoHandle(res);}}}catch(EOFExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}}privatevoidmodifypasswdHandle(Responseres){if(res.getData()!=null){JOptionPane.showMessageDialog(null,"密码修改成功");}else{JOptionPane.showMessageDialog(null,"密码修改失败 服务器忙,请稍后再试!");}}privatevoidchangeInformationHandle(Responseres){if(res.getData()!=null){JOptionPane.showMessageDialog(null,"修改成功");}else{JOptionPane.showMessageDialog(null,"服务器忙,请稍后再试!");}}. .privatevoidpublicInfoHandle(Responseres){Stringstr=(String)res.getData();publicInfo.setText(str);}privatevoidreceiveFileHandle(Responseres){}privatevoidindividualTalkHandle(Responseres){Messagemessage=(Message)res.getData();Useruser=message.getFrom();if(!ClientMainClass.individual.containsKey(user.getId())){intflag=JOptionPane.showConfirmDialog(null,user.getName()+"请求与你私聊,是否接受?","",JOptionPane.YES_NO_OPTION);if(flag==JOptionPane.NO_OPTION){return;}IndividualTalkWindowindi=newIndividualTalkWindow(user);ClientMainClass.individual.put(user.getId(),indi.getReceivedmessageArea().getTextPane());indi.showMe();}JTextPanejtp=ClientMainClass.individual.get(user.getId());try{//输出信息发送人,时间jtp.getDocument().insertString(jtp.getDocument().getLength(),user.getName()+""+message.getTime()+" ",set);}catch(BadLocationExceptione){e.printStackTrace();}//输出信息message.analysisMessage(jtp);}. .privatevoidreceiveMessageHandle(Responseres){Messagemessage=(Message)res.getData();if(ClientMainClass.shield.contains(message.getFrom().getId())){return;}try{//输出信息发送人,时间receive.getDocument().insertString(receive.getDocument().getLength(),message.getFrom().getName()+""+message.getTime()+" ",set);}catch(BadLocationExceptione){e.printStackTrace();}//输出信息message.analysisMessage(receive);}privatevoidofflineHandle(Responseres){Useruser=(User)res.getData();ClientMainClass.onlineUsers.remove(user);userList.freash(ClientMainClass.onlineUsers);Calendarc=Calendar.getInstance();Stringtime=c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH)+"-"+c.get(Calendar.DAY_OF_MONTH)+""+(c.get(Calendar.HOUR_OF_DAY)+8)+":"+c.get(Calendar.MINUTE)+":"+c.get(Calendar.SECOND);try{receive.getDocument().insertString(receive.getDocument().getLength(),user.getName()+""+time+"下线 ",set);}catch(BadLocationExceptione){e.printStackTrace();. .}}privatevoidonlineHandle(Responseres){Useruser=(User)res.getData();ClientMainClass.onlineUsers.add(user);userList.freash(ClientMainClass.onlineUsers);Calendarc=Calendar.getInstance();Stringtime=c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH)+"-"+c.get(Calendar.DAY_OF_MONTH)+""+(c.get(Calendar.HOUR_OF_DAY)+8)+":"+c.get(Calendar.MINUTE)+":"+c.get(Calendar.SECOND);try{receive.getDocument().insertString(receive.getDocument().getLength(),user.getName()+""+time+"上线 ",set);}catch(BadLocationExceptione){e.printStackTrace();}}}4系统设计与实现4.1开发环境工具基于JAVA聊天系统的设计主要运用JAVA与语言与Socket类结合而开发。其开发的主要环境包括:服务器端:(Windows平台)首先应有java环境jdk,建议采用jdk1.5以上,另外还需配置classpath环境变量,添加Hibernate运行所需要的jar包,本系统开发工具为MyEclipse5.5;客户端:只要有java环境jdk就可以,建议jdk1.5。4.2硬件环境. .本系统运行环境所需用到的环境为:硬件配置:中央处理器(CPU):P42.0G的处理器;硬盘:40GB以上硬盘;内存:512DDR内存;显示器:17寸显示器等;显卡:128M显存显卡软件环境:WINDOWSXP、tomcat5.5、Eclipse、jdk1.6.03等。4.3网站功能模块的测试本次课设的编译环境,及编写平台为java。主要用到的类为java.net包中的Socket类和javax.swing包中的类。服务器线程在程序运行期间一直有效,接受客户端请求信息,转发客户端聊天内容,查看用户信息。客户端运行时必须先登陆,登陆界面如图1,聊天程序主界面如图2,可以和所有在线用户群聊,也可以和某个用户私聊如图3。并且可以查看用户信息和修改自己的信息。本系统实现了选择图像,发送表情,,自动刷新在线用户等功能。最终效果:图1登陆界面. .发送窗口显示信息图1客户端主界面. .图2私聊界面5总结5.1毕业设计总结和展望 本毕业设计实现了简单位的实时聊天功能,经过细心的调试和排错解决了绝大部分的问题。但几乎每一个计算机程序都会有这样那样的不足,尤其是未经过精心维护的非商业软件。本聊天系统程序对于初涉此领域的毕业设计课题来说,尤其在开始初期,感觉逻辑复杂,难以控制,因此至今还有许多未能解决的缺陷。目前本聊天系统还有待完善的功能如下:1、聊天系统缺乏好友列表;2、没有实现文件发送功能;3、也没有详细考虑聊天室管理功能。尽管毕业设计到现在已接近尾声,但是对于上述的缺陷,本人还会不断对聊天系统进一步的完善它,期望在今后的日子里凭借自身的技术把系统做成一套深受欢迎的聊天系统。5.2经验和感想 . .基本JAVA聊天室开发与实现作为毕业设计,是本人目前做过的最大的程序。平时自己也常到其它聊天室进行聊天,因此,自己也曾想过以后学会了电脑就一定亲自设计一款聊天系统,如今,总算实现了自己的梦想。基本JAVA聊天系统设计与实现毕业设计正是建立在Java平台上,是本人以前未曾接触过的领域。凭着探索新知识的热情,我选择了该设计题目。学习该平台背景和功能的时间远远超出了我想象的时间。在设计初期,为了画出一个简单的图形,都需要花一定的时间去掌握和熟悉。为了进一步探索深层次的技巧,我花费了大量时间在sun的Java主页上,阅读了几十篇英文的技巧和代码样例。在学习期间,本人还通过网上的各种JAVA源码进行学习与研究,我原以为这样的设计水平将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的聊天系统思路的设计就显得不是最大的障碍了。我在一个月内写完这个程序,经过了很多次的调试,终于完成了现在的程序。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。致谢. . 紧张而忙碌的毕业设计就要结束了,在完成了系统的功能设计后,我感到由衷的喜悦和自豪。在我做毕业设计期间,许多老师,同学和朋友给我我无私的关怀和帮助,在此,我要向他们表示衷心的感谢。首先,我要感谢学校的老师在毕业设计期间给了我悉心的关怀与帮助,并且给了我许多关键的,建设性的指导。这次的毕业设计让我受益匪浅。可以这样说,用计算机来解决繁重而低效的手工管理工作,计算机发展史上的必然。在理论课的学习中,我掌握了基础课和专业课的理论知识,也曾经做过一些程序设计的联系和计算机综合试验,但真正动手设计一个管理软件,还是第一次。在这次的毕业设计中,我曾遇到了许多困难,而在克服这些困难的过程中,我的各方面的能力又有了很大的提高,使我的理论知识更好的与实践相结合,增强了专业技能的可实践性。从调研,需求分析到查找资料,结构设计,详细设计以及调试程序,到最后的写使用说明书,我终于设计出了一个比较完整的,周密的,可使用的聊天系统。通过这次的毕业设计,我真正了解了软件工程设计的整个过程,既巩固了以前的理论知识,也为我以后的工作奠定了良好的基础。当然,由于时间的短促,我所完成的系统并不是尽善尽美的,还有待进一步的修改和完善。最后,请允许我再一次向毕业期间无私帮助过我的老师,同学和朋友表示最衷心的感谢。. .参考文献1Java2图形设计 卷二:Swing(美)DavidM.Geary2Java2编程思想 (美) BruceEckel3JAVA网络编程(第一卷)(美) W.RichardStevens4Java语言与面向对象程序设计(清华大学出版)印雯编著.

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

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

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