版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE20基于Java的聊天室程序设计CHATROOMPROGRAMMINGBASEDONJAVAPAGEI摘要网络聊天室是一种应用广泛的网络聊天方式,操作简单,功能丰富,是教学和学习面向对象的编程思想的理想项目。可以使用多种编程语言和开发功能完善网络聊天室。本毕业设计论文介绍用Java语言设计和实现一个网络聊天室的过程,本系统采用C/S架构设计,整个项目分为服务器端和客户端。使用最新Java2标准Swing组件,开发出简洁美观和布局合理的用户和服务器界面;利用Socket网络开发急速实现客户端和服务器端的连接访问,实现网络功能;通过对数据流操作的合理设计,实现信息传递、接受和数据保存。同时采用多线程、多任务的设计思想开发出性能稳定,功能全面的服务器。完整的实现系统的功能。该聊天室工具主要解决了两方面的问题。服务器端和客户端。在服务器端可以实现如下功能:能够处理用户的注册;通过身份验证方式处理用户登录;可以向所有在线用户广播信息;对于不良聊天人士给予警告或者赶出聊天室;删除长久不使用的用户信息;配有操作文档;及时接收用户的服务请求帮助。在客户端可以实现如下功能:聊天信息的传输,支持私聊,支持表情等功能。关键词:聊天室;Java;Swing组件;Socket技术PAGE34PAGEIIABSTRACTThenetworkchatroomisakindofappliedextensivenetworkchatmethod,operateincaseandthefunctionisabundant,ItcanbeusedasagoodcaseforlearningofJavadesignlanguageandtheObject-OrientedProgramminglanguage,Thereismanyprogramminglanguageofdesigntodevelopanetworkchatroomwithperfectfunction.ThisgraduationthesisofdesignintroductionhowtousetheJavalanguagedesignandcarryoutnetworkchatroom,ThesystemadoptiontheC/Sstructuredesign,thewholesystemisdividedintotheserverandclient.UsedstandardmodulesofSwingoflatestJava2,developasimpleanddirectbeautyuserinterface,WemakeuseoftheSockettechnologytointerconnecttheserverandclientbynet-work;organizethedatabygooddesignofdatastreamtosentoracceptthemessagebetweenusersandtorecordthemessagefordataever;wealsousethemulti-threadtomaketheprogramwithmanyfunction.Thischatroom’stoolwillsolvetwomainproblems,oneisserverandtheotheriscustomer.Itwillobtainfollowingfunctionswithserver:handingtheregistrationofcustomer;passingverificationofbodymethod;processingcustomerlogging;broadcastinginformationtoon-linecustomers;warningandevictingbadchatpersonageoutofchatroom;deletinglong-lastthecustomerinformation;havingoperatingtext;acceptingcustomer’sservingrequests.Itwillobtainfollowingfunctionswithcustomer:deliveringthechatinformation;supportingprivatechat;supportingthefacialexpression;ect.Keywords:chat;Java;Swingcomponent;Socket
目录第一章系统开发的意义及需求分析 1第一节课题来源 1第二节需求分析 1第二章系统开发技术 2第一节Java的网络功能与编程 2第二节IP/TCP协议常识 3第三节Socket的简介 3第四节Swing的简介 5第五节C/S结构 PAGEREF_Toc296150490\h6第三章系统分析与设计方案 8第一节开发环境及工具 8第二节聊天系统的总体设计要点 \h8第三节系统的功能模块划分及设计原理 10第四章系统实现与最终效果 25第一节系统工作的过程 25第二节使用方法 25第三节各功能模块运行效果 25第四节功能模块测试 31第五章总结 32第一节毕业设计总结和展望 32第二节经验和感想 32参考文献 34致谢 35第一章系统开发的意义及需求分析第一节课题来源根据当前网络的需求,网络聊天越来越受到各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过Java语言,对网络编程也较有兴趣,为了更好的考验自己对Java语言的掌握程度,本人就决定以《基于Java的网络聊天室》为毕业设计,希望通过这一次能进一步提高本人的网络开发编程的能力。第二节需求分析聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器。服务器端的任务:1、服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接。
2、服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。客户端应该完成的工作包括:1、与服务器端建立通信通道,向服务器端发送信息。
2、接收来自服务器的信息。相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。
第二章系统开发技术第一节Java的网络功能与编程一、Java概述:美国硅谷有一句行话,每10年~15年有一次轮回。最近的一次轮回就是从Java开始。Java是一个由Sun公司开发而成的新一代编程语言。使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种www浏览器,哪一种计算机,哪一种操作系统,只要www浏览器上面注明了“支持Java”,你就可以看到生动的主页。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。Java语言有下面一些特点:简单、面向对象、分布式、解释执行、安全、体系结构中立、可移植、高性能、多线程以及动态性。丰富的类库Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。语言包提供的支持包括字符串处理、多线程处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。输入输出包用统一的"流"模型来实现所有格式的I/O,包括文件系统、网络、输入低级网络包用于实现Socket编程。抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。网络包支持Internet的TCP/IP协议,提供了与Internet的接口。它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。Java和C、C++对于变量声明、参数传递、操作符、流控制等使用了相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时,Java为了实现其简单、安全等特性,也摒弃了C和C++中许多不合理的内容[1]。二、Java语言在网络上的应用Java程序可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。例如Java程序可以每隔一定时间读取某结点提供的最新数据,并以图表的形式显示出来。在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法(method)获取该对象所代表的资源。第二节IP/TCP协议常识一、IP、TCP协议的特点:TCP/IP(TransmissionControlProtocol/InternetProtocol)是传输控制协议/网际协议的缩写,TCP/IP是当今网络互联的核心协议。TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。IP协议的作用:第一,它是网络层的协议,提供互联网上数据传输的统一格式。第二,提供不可靠的无连接的服务。第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。TCP协议的功能:差错控制——可靠性、面向连接、分段(Segment)、端口号。TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑动窗口机制来保证传输的可靠性,及进行流量控制。二、TCP/IP协议进行传输数据传输的过程:应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP数据包封装在IP包内,通过网络送给目的TCP。接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,向TCP提供所有TCP需要的服务[2]。三、端口号:有的时候,一个ip地址不能完整的标识一台服务器,这是因为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是端口。端口实际是一个16位长的地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都知道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的个客户端应用程序。在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端[3]。第三节Socket的简介Socket简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。Java通过socket来完成它所有的网络底层的通讯,socket是一种通讯的通道,通过它可以将数据通过特定的端中发送及接收。Java中的socket可以分成二大类:DatagramSockets(数据包socket)和StreamSockets(流socket)。StreamSocket有一个永久性的链接,可以确保数据可靠的发送到对方。但是StreamSocket所占的资源更多。Java主要通过Socket及ServerSocket来实现StreamSocket,一个用于客户端,另一个用户服务器端。具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服务器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信[8]。客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP和通过名字或IP直接得到InetAddress的方法。上面的方法基本可以建立一条连线让两台计算机相互交流了。数据则是通过I/O流进行传输。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。所以你也必须导入Java.io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。服务器可以不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。
两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。一、Socket程序的工作过程:1.建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接道。2.数据通信:利用虚拟连接通道传送数据信息进行通信。3.关闭:通信结束时,再将所建的虚拟连接拆除。具体如下:1服务器1服务器serversocket2监听4.连接5读6写7关闭3客户端socket6读5写7关闭图2-1Socket程序的工作过程二、三次握手协议:第一次握手:原主机发送一个带有本次连接的序号的请求的一个数据帧第二次握手:目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。第三此握手:源端机收到含有两次初始序列号的应答后,再向目的主机发送一个带有两次连接的序列号的确认。具体过程如下:图2-2三次握手协议第四节Swing的简介AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。
AWT设计的初衷是支持开发小应用程序的简单用户界面。例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级(light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。Swing采用了一种MVC的设计范式,即“模型-视图-控制”(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。Swing外观感觉采用可插入的外观感觉(PluggableLookandFeel,PL&F)。在AWT组件中,由于控制组件外观的对等类与具体平台相关,使得AWT组件总是只有与本机相关的外观。Swing使得程序在一个平台上运行时能够有不同的外观。用户可以选择自己习惯的外观。一、框架、监听器和事件:框架(Frame,JFrame)是Java图形用户界面的基础,它就是我们通常所说的窗口,是Windows/XWindow应用程序的典型特征。说到Windows/XWindow,大家很容易联想到“事件(Event)驱动”。Java的图形用户界面正是事件驱动的,并且由各种各样的监听器(Listener)负责捕捉各种事件。如果我们需要对某一个组件的某种事件进行捕捉和处理时,就需要为其添加监听器。比如,我们要在一个窗口(JFrame)激活时改变它的标题,我们就需要为这个窗口(JFrame对象)添加一个可以监听到“激活窗口”这一事件的监听器——WindowListener。添加监听器通常由组件类提供的一个addXxxxxListener的方法来完成。比如JFrame就提供有addWindowListener方法添加窗口监听器(WindowListener)。二、按钮、切换按钮、复选按钮和单选按钮切换按钮,有两种状态的按钮,即按下状态和弹起状态,若称为选择状态或未选择状态。复选按钮,又叫复选框,用一个小方框中是否打勾来表示两种状态。单选按钮,又叫收音机按钮,以小圆框打点表示被选中。常成组出现,一组单选按钮中只有一个能被选中。除一般按钮外,其余三种按钮都有两种状态,即选择(按下)状态和未选择(弹起)状态。那么我们又该如何判断呢?切换按钮(JToggleButton)提供了一个isSelected()方法用来判断当前所处的状态,返回值为真(true)时表示它处于选择状态,返回值为假(false)时表示它处于未选择状态。而复选按钮(JCheckBox)和单选按钮(JRadioButton)都是从JToggleButton继承的,所以也具有isSelected()方法。三、文本输入框、密码输入框文本输入框包括两种,单行文本输入框(JTextField)和多行文本输入框(JTextArea)。密码输入框则只有一种(JPasswordField)。JPasswordField是JTextField的子类,它们的主要区别是JPasswordField不会显示出用户输入的东西,而只会显示出程序员设定的一个固定字符,比如'*'或者'#'。四、窗格、滚动窗格和布局管理窗格(JPanel)和滚动窗格(JScrollPane)在图形用户界面设计中大量用于各种组件在窗口上的布置和安排。这里所谓的布置和安排,就是布局(Layout)。将加入到容器(通常为窗口等)的组件按照一定的顺序和规则放置,使之看起来更美观,这就是布局。布局由布局管理器(LayoutManager)来管理。
我们设计一个窗口,其中是要添加若干组件的。为了管理好这些管理的布局,我们就要使用布局管理器。比如说,设计一个简单的编辑器,这个编辑器中只需要放置两个按钮和一个多行文本框。这些组件是是按照一定的位置关系较规范的安排的。那么,为了按照一定的位置关系安排这些组件,需要用到布局管理器了。常用的布局管理器有:FlowLayout、BorderLayout、GridLayout、BoxLayout等,其中FlowLayout和BorderLayout最常用。第五节C/S结构C/S结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。Client/Server或客户/服务器模式:Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。一、C/S工作模式C/S结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。客户端完成数据处理,数据表示以及用户接口功能;服务器端完成DBMS的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。二、C/S结构的优点C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个:只适用于局域网。而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。客户端需要安装专用的客户端软件。首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。
第三章系统分析与设计方案第一节开发环境及工具本系统所用的工具:服务器端:(Windows平台)首先应有Java环境jdk,建议采用jdk1.4.2;Eclipse。客户端:Java环境jdk,建议jdk1.42;Eclipse。本系统运行所需用到的环境为:硬件配置:中央处理器(CPU):P42.0G以上的处理器;硬盘:40GB以上硬盘;内存:256以上的DDR内存;显卡:128M以上显存显卡软件配置:WINDOWSXP版本、All-In-One-Eclipse-311、j2sdk-1.42等。第二节聊天系统的总体设计要点一、实现思想在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。服务器端工作流程:服务器端通过系统调用创建一个ServerSocket与指定的本地端口绑定,就可以在端口进行侦听。如果有客户端连接请求,则创建一个Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。客户端工作流程:客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。二、系统功能流图:否否是服务器serversocket监听建立与客户端连接的套接字1.读客户端信息2.向客户端转发信息关闭服务器客户端socket1.读服务端信息2.向服务器写信息关闭客户端启动AppServer.java启动ChatClient.java登录注册是否注册图3-1系统功能流图功能流说明如下:1.启动服务器程序,服务器端创建一个ServerSocket对象,指定端口号。2.ServerSocket对象等候客户端的连接请求。3.启动客户端程序,登录用户。如果未注册,先注册再登录。登录成功进入聊天室用户界面。4.客户端创建一个Socket对象,指定主机地址和端口号,向服务器发送连接请求。5.服务器端收到客户端请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。6.服务器端和客户端分别建立字节输入/输出流,进行数据传输准备。7.服务器端和客户端通过各自的字节输入流获得对方发送过来的数据,通过字节输出向对方发送数据。8.一方决定结束通信,向对方发送结束信息,另一方收到结束信息后,双方分别关闭各自的TCP连接。9.对象停止等候客户端连接请求。三、多用户实时工作原理图图3-2多用户实时工作原理图注:服务器的run()方法中采用了while(true)结构,不断监听客户端的请求,如收到请求,建立与当前请求的客户端连接的套接字,从而与客户端建立联系。第三节系统的功能模块划分及设计原理当用户聊天时,将当前用户名、聊天对象、聊天内容和是否私聊进行封装并且序列化,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是1秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为1秒最佳,因为每个用户都不可能在1秒内连续发送信息。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化显示在聊天信息界面上。一、服务器程序模块(AppServer.Java)服务器与客户间通过套接口Socket(TCP)连接。在Java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类Java/r/.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8000,然后无限循环调用accept()方法接受客户程序的连接。服务器具有以下功能:1.启动服务,建立侦听,接受客户端连接。2.从流中读取经过序列化的对象。3.分析读取的对象进行相应的操作(登录信息的验证反馈、注册信息的验证和反馈、转发聊天信息等)4.向客户端发送系统消息。5.保存日志6.关闭服务,并向客户端发送服务器关闭消息。服务器程序模块源码:privateServerSocketserverSocket;privateServerFramesFrame;privatestaticVectoruserOnline=newVector(1,1);privatestaticVectorv=newVector(1,1);//创建服务器启动服务监听1001端口publicAppServer(){sFrame=newServerFrame(); try{ serverSocket=newServerSocket(1001); //获取服务器的主机名和IP地址 InetAddressaddress=InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText("1001"); }catch(IOExceptione){fail(e,"不能启动服务!");} sFrame.txtStatus.setText("已启动..."); this.start();//启动线程 }publicstaticvoidfail(Exceptione,Stringstr){ System.out.println(str+"。"+e); } /** *监听客户的请求,当有用户请求时创建Connection线程 */publicvoidrun(){ try{ while(true){ //监听并接受客户的请求 Socketclient=serverSocket.accept(); newConnection(sFrame,client,userOnline,v);//支持多线程 }}catch(IOExceptione){ fail(e,"不能监听!"); } } /** *启动服务器 */publicstaticvoidmain(Stringargs[]){ newAppServer(); }}当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。二、登录程序模块(Login.Java)是客户端程序登录界面,负责用户帐号信息的验证与接收服务器的反馈。客户端请求连接,服务器的accept()方法建立与客户端的套接字连接。客户端将登录信息封装成Customer对象通过输出流发送服务器,等待服务器的验证,服务器反馈验证信息,客户端根据反馈信息进行登录和登录信息错误处理。关键代码如下:publicvoidactionPerformed(ActionEventae){Objectsource=ae.getSource();if(source.equals(btnLogin)){//判断用户名和密码是否为空 if(txtUserName.getText().equals("")||pwdPassword.getText().equals("")){JOptionPaneop1=newJOptionPane(); op1.showMessageDialog(null,"用户名或密码不能为空"); }else{strServerIp=txtServer.getText(); login(); }}if(source.equals(btnRegister)){ strServerIp=txtServer.getText(); this.dispose(); newRegister(strServerIp); }if(source==btnExit){ System.exit(0); } }//actionPerformed()结束publicvoidlogin() { //接受客户的详细资料 Customerdata=newCustomer(); data.custName=txtUserName.getText(); data.custPassword=pwdPassword.getText(); try{ //连接到服务器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamtreamToServer=newObjectOutputStream(toServer .getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Customer)data); //读来自服务器socket的登录状态 BufferedReaderfromServer=newBufferedReader( newInputStreamReader(toServer.getInputStream())); Stringstatus=fromServer.readLine(); if(status.equals("登录成功")){ newChatRoom((String)data.custName,strServerIp); this.dispose(); //关闭流对象 streamToServer.close(); fromServer.close(); toServer.close(); }else{ JOptionPane.showMessageDialog(null,status); //关闭流对象 streamToServer.close(); fromServer.close(); toServer.close(); } }catch(ConnectExceptione1){ JOptionPane.showMessageDialog(null,"未能建立到指定服务器的连接!"); }catch(InvalidClassExceptione2){ JOptionPane.showMessageDialog(null,"类错误!"); }catch(NotSerializableExceptione3){ JOptionPane.showMessageDialog(null,"对象未序列化!"); }catch(IOExceptione4){ JOptionPane.showMessageDialog(null,"不能写入到指定服务器!"); } }//login()结束 /** *启动登陆窗体 *@paramargs */ publicstaticvoidmain(Stringargs[]){ newLogin();}三、注册程序模块(Register.Java)为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。注册模块的原理跟登录模块基本相同。注册信息封装成Register_Customer对象,但服务器只验证用户名,且只要求用户名不重复,服务器检验注册信息文件中的用户名,若不重复则反馈注册成功的信息。其他的注册信息(密码、年龄、邮箱)合法性都交给注册模块自己完成。关键代码如下:publicvoidactionPerformed(ActionEventae) {Objectsource=newObject(); source=ae.getSource();if(source.equals(btnOk))//"确定"按钮{ register(); } if(source.equals(btnCancel))//"返回"按钮 { newLogin(); this.dispose(); } if(source.equals(btnClear))//"清空"按钮 {txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); } }//actionPerformed()结束publicvoidregister() { //接受客户的详细资料Register_Customerdata=newRegister_Customer(); data.custName=txtUserName.getText(); data.custPassword=pwdUserPassword.getText(); data.age=txtAge.getText(); data.sex=rbtnMale.isSelected()?"男":"女"; data.email=txtEmail.getText(); data.head=comboBox.getSelectedItem().toString(); //验证用户名是否为空 if(data.custName.length()==0) { JOptionPane.showMessageDialog(null,"用户名不能为空"); return; } //验证密码是否为空 if(data.custPassword.length()==0) { JOptionPane.showMessageDialog(null,"密码不能为空"); return; } //验证密码的一致性 if(!data.custPassword.equals(pwdConfirmPass.getText())) { JOptionPane.showMessageDialog(null,"密码两次输入不一致,请重新输入"); return; } //验证年龄是否为空 if(data.age.length()==0) { JOptionPane.showMessageDialog(null,"年龄不能为空"); return; } //验证年龄的合法性 intage=Integer.parseInt(txtAge.getText()); if(age<=0||age>100){ JOptionPane.showMessageDialog(null,"年龄输入不合法"); return; } //验证Email的正确性 intFound_flag=0;//判断标志 for(inti=0;i<data.email.length();i++) { if(data.email.charAt(i)=='@') { Found_flag++; } } if(Found_flag!=1) { JOptionPane.showMessageDialog(null,"电子邮箱格式不正确,请重新输入"); return; } try { //连接到服务器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Register_Customer)data);//读来自服务器socket的登陆状态BufferedReaderfromServer=newBufferedReader(newInputStreamReader(toServer.getInputStream()));Stringstatus=fromServer.readLine();//显示成功消息JOptionPaneop=newJOptionPane();op.showMessageDialog(null,status);if(status.equals(data.custName+"注册成功")) {txtUserName.setText("");pwdUserPassword.setText("");pwdConfirmPass.setText("");txtAge.setText("");txtEmail.setText(""); }//关闭流对象 streamToServer.close();fromServer.close(); } catch(InvalidClassExceptione1) { JOptionPane.showMessageDialog(null,"类错误!"); } catch(NotSerializableExceptione2) { JOptionPane.showMessageDialog(null,"对象未序列化!"); } catch(IOExceptione3) { JOptionPane.showMessageDialog(null,"不能写入到指定服务器!"); } }//方法register()结束 publicstaticvoidmain(Stringargs[]) { newRegister(""); }四、客户聊天主程序模块(ChatRoom.Java)客户通过Socket(InetAddress,port)建立与服务器的连接。客户端通过构造ObjectInputstream,ObjectOutputstream与服务器建立输入输出流,然后双方通过该输入输出流来相互传递信息,服务器一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端接受服务器传来的聊天信息进行处理后显示在自己的聊天纪录中。同样客户端要发送文件和信息时也向服务器发送请求,服务器同样通过accept()方法返回一个Socket对象,客户端就可也进行相应的操作。聊天客户端必须具有以下功能。1.连接服务器,发送用户登陆请求。2.向服务器发送聊天信息。3.接收服务器转发的了信息。4.接受服务器发送的系统消息。关键源码如下:publicvoidrun(){intintMessageCounter=0;intintUserTotal=0;booleanisFirstLogin=true;//判断是否刚登陆booleanisFound;//判断是否找到用户Vectoruser_exit=newVector();try{ //SockettoServer; //toServer=newSocket(strServerIp,1001); for(;;){ SockettoServer; toServer=newSocket(strServerIp,1001); //将信息发往服务器 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getOutputStream()); //收来自服务器的信息 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getInputStream()); messobj=(Message)streamfromserver.readObject(); ////////刷新聊天信息列表////////// if(isFirstLogin)//如果刚登陆 { intMessageCounter=messobj.chat.size();//屏蔽该用户登陆前的聊天内容 isFirstLogin=false; } if(strLoginName.equals(messobj.ti)){ //taUserMessage.append("nibeiti"); exitChatRoom(); JOptionPane.showMessageDialog(null,strLoginName +"你被管理员剔除!"); } if(!serverMessage.equals(messobj.serverMessage)){ serverMessage=messobj.serverMessage; taUserMessage.append("[系统消息]:"+serverMessage+"\n"); } //taUserMessage.setText(""); for(inti=intMessageCounter;i<messobj.chat.size();i++){ Chattemp=(Chat)messobj.chat.elementAt(i); Stringemote=temp.emote; if(emote.equals("表情")){ emote=""; }else{ emote+="地"; } Stringtemp_message; if(temp.chatUser.equals(strLoginName)){ if(temp.chatToUser.equals(strLoginName)){ temp_message="系统提示您:请不要自言自语!"+"\n"; }else{ if(!temp.whisper)//不是悄悄话 { temp_message="【你】对【"+temp.chatToUser+"】" +emote+"说:"+temp.chatMessage+"\n"; }else {temp_message="【你】悄悄对【"+temp.chatToUser +"】"+emote+"说:"+temp.chatMessage+"\n"; } } }else{ if(temp.chatToUser.equals(strLoginName)){ if(!temp.whisper)//不是悄悄话 { temp_message="【"+temp.chatUser+"】对【你】" +emote+"说:"+temp.chatMessage +"\n"; }else{ temp_message="【"+temp.chatUser+"】悄悄对【你】" +emote+"说:"+temp.chatMessage +"\n"; } }else{ if(!temp.chatUser.equals(temp.chatToUser))//对方没有自言自语 { if(!temp.whisper)//不是悄悄话 { temp_message="【"+temp.chatUser+"】对【" +temp.chatToUser+"】"+emote +"说:"+temp.chatMessage+"\n"; }else{ temp_message=""; } }else{ emp_message=""; } } } taUserMessage.append(temp_message); intMessageCounter++;}//显示用户进入聊天室的信息if(messobj.userOnLine.size()>intUserTotal){//chenminStringtempstr=((Customer)messobj.userOnLine .elementAt(messobj.userOnLine.size()-1)).custName;//Stringtempstr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心衰护理课件教学课件
- 淮阴工学院《通信原理1》2022-2023学年第一学期期末试卷
- DB5116T17-2024电梯维护保养质量要求与抽查规则
- DB 3705-T 16-2024《管花肉苁蓉培育技术规程》
- 企业管理-《固定资产移交报告》
- 海水养殖的环境影响评估方法考核试卷
- 合成材料制造的工艺装备更新考核试卷
- 外卖行业的季节性波动分析考核试卷
- 煤炭行业的国际市场拓展与合作考核试卷
- 城市轨道交通的科技创新与产业发展考核试卷
- 湖北机场集团限公司2024年春季校园招聘【35人】(高频重点提升专题训练)共500题附带答案详解
- 河南省附属绿地绿化规划设计规范
- 微测网题库完整版行测
- 2023年中级会计实务试题及答案大全
- T-CPQS C010-2024 鉴赏收藏用潮流玩偶及类似用途产品
- 代运营合作服务协议
- 有限空间作业应急管理制度
- 慢性肾衰竭-课件
- 罗兰贝格-正泰集团品牌战略项目-品牌战略设计与高阶落地建议报告-20180627a
- 2024砍伐树木合同书
- 2024年02月重庆市沙坪坝区事业单位2024年第一季度公开招聘167名工作人员0笔试历年典型考题及考点研判与答案解析
评论
0/150
提交评论