下载

1下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于JAVA的聊天软件

基于JAVA的聊天软件.doc

基于JAVA的聊天软件

要活出你的霸气劲
2017-09-20 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《基于JAVA的聊天软件doc》,可适用于IT/计算机领域

基于JAVA的聊天软件学号:毕业设计,论文,题目:基于JAVA的聊天软件泰山医学院本科毕业设计,论文,论文原创性保证书我保证所提交的论文都是自己独立完成如有抄袭、剽窃、雷同等现象愿承担相应后果接受学校的处理。摘要网络即时通讯就是网络上实时进行信息交流。本文用JAVA语言设计即时通讯系统是为了更好地满足人们的网上聊天和彻底地实现两台计算机之间点对点的信息交流的需求提出来的也是当今网络迅速发展的结果。即时通讯系统的研究目前是互联网中一个热门方向尤其是关于企业级即时通讯系统更为国内外应用的热点。企业版的即时通讯软件的诞生给企业的管理带来了新的思路和手段。推动了企业工作效率的提高办公费用的降低泰山医学院本科毕业设计,论文,引起了工程应用领域的研究热潮。本文采用了面向对象的JAVA程序设计语言和强大的Oracle数据库管理系统利用JAVA提供的丰富的类库作为支撑开发了这个简单的网络即时通信系统。它可以作为公司、企业内部的交流的工具既充分地利用了网络资源又可以保证内部信息的安全。本文分析了本即时通讯系统开发的可行性并重点对技术可行性(选择JAVA做了详细分析借助数据流图和数据字典对系统的功能和性能进行了详细的需求分析建立了系统的逻辑结构用结构图和层次输入输出处理图建立了系统的总体结构采用了过程设计语言对系统的各个功能模块进行了详细设计用JAVA语言编码实现了本系统。此通讯软件在内部网络测试过程中实现了注册、登录、添加好友、删除好友、查找好友、收发信息等基本的通讯功能。关键词:网络通信面向对象流媒体泰山医学院本科毕业设计,论文,AbstractThenetworkinstantcommunicationistheInternetrealtimeinformationexchangeThesubjectoriginallydesignTodesigntheinstantcommunicationsystemwithJAVAlanguageistobettermeetpeople'sneedstochatonthenetworkandcompletelyrealizepointtopointinformationcommunicationbetweentwocomputers,atthesametimealsoisnowthenetworkrapiddevelopmentresul下的Java必须要防止病毒的入侵Java不支持指针一切对内存的访问都必须通过对象的实例变量来实现这样就防止了程序员使用欺骗手段访问对象的私有成员同时也避免了指针操作中容易产生的错误。不仅仅因为Java拥有众多的优点Java还为人们提供了大量的类以满足网络化、多线程、面向对象系统的需要。它包括:()语言包提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等可以用它简单地实现Java程序的运行平台。()实用程序包提供的支持包括堆栈、可变数组、时间和日期等。()输入输出包用统一的”流”模型来实现所有格式的I包括文件系统、网络、输入。()低级网络包用于实现Socket编程。()抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件包括窗口、菜单、滚动条、对话框等使得Java可以移植到不同平台的机器。()网络包支持Internet的TCPIP协议提供了与Internet的接口。它支持URL连接Wv门刀的即时访问并且简化了用户服务器模型的程序设计。因为拥有如此强大了类支持使得JAVA十分适合用来编程网络软件。JAVA语言对于网络应用程序提供了两种功能强大的网络支持机制:第一章前言()URL访问网络资源的类(用于访问Internet网上资源的应用)()Socket通讯的类(针对clientserver客户端服务器」模式的应用以及实现某些特殊的协议的应用它的通讯过程是基于TCPIP协议中传输层接口Socket实现的)。JAVA工具()JDK)Java编译器Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为javaJava编译器把这种扩展名的文件编译成扩展名为class的文件。源文件中的每个类在编译后都将产生一个class文件这意味一个Java源代码文件可能编译生成多个class文件。)Java解释器Java解释器对编译生成的字节码格式的可执行程序的运行提供支持它是运行非图形Java程序的命令行工具。)Appletviewer它是JavaApplet的简单测试工具可使用它来测试Java却plet程序而不需要WWW浏览器的支持。()VisualJVisualJ集成了可视化界面设计、交互式调试、代码编辑、联机帮助信息和介绍如何快速掌握该开发环境的实用向导等多项功能同时具有能充分利用ActiveX和COM新技术的优势。利用VisualJ可创建交互性很强的Internet应用程序是难得的Java开发系统。(论文的研究目标和主要研究内容研究目标:可用于企业等内部的网络即时通讯。主要研究内容:实现客户端与服务器端的信息交流。完成登陆、注册、收发信息。(论文的结构安排本论文共分为七部分:第一部分简单的分析了本即时通讯系统开发的可行性并重点对技术可行性(选择JAVA)做了详细分析第二部分借助数据流图和数据字典对系统的功能和性能进行了详细的需求分析建立了系统的逻辑结构第三部分用结构图和层次输入输出处理图建立了系统的总体结构第四部分采用了过程设计语言对系统的各个功能模块进行了详细设计第五部分用JAVA语言编码实现了本系统并对系统的功能进行了简要第一章前言的测试和调试(附录)第六部分为系统测试部分对系统的功能进行了全面测试(参考本论文测试图形)最后是此次设计的结论总结及部分参考文献。第二章需求分析第二章需求分析系统开发目的一般来说聊天工具大多有由客户端程序和服务器程序组成。但是现在众多网络公司提供的免费聊天工具通常只提供客户端程序而不提供服务器程序这样就无法灵活地应用在公司、企业的内部网络中。如果能够开发一种聊天工具可以灵活的应用在公司、企业的内部它就可作为公司、企业的内部交流工具使用既能充分利用了网络资源又能保证内部信息安全就非常好了。正是出于对于这个问题的思考本文设计了这个通讯工具。它可以很好解决这个问题从而为企业或是公司的内部的信息的交流提供了很好的帮助还可以保证内部信息的安全。这也正是开发这个聊天工具的意义所在。需求分析目前虽有很多用于通讯的软件但一些企业、学校、公司等局域网仍然需要满足自己的即时通讯软件。该软件应该具备信息交流的基本功能:登陆、注册、聊天、语音、视频等。实现成员间一对一、一对多的信息交流。目前客户对网络安全问题越来越重视大众聊天软件经常受到病毒的攻击造成号码被盗信息丢失。本文的即时通讯软件可以减少对远程服务器的依赖防治网络上病毒的攻击造成的损失有利于对客户信息的保护更好地服务于社会。通过调查要求系统需要有以下功能:()要求有良好的人机界面()较好的权限管理()原始数据修改简单方便支持多条件修改()方便的数据查询支持多条件查询()相应的权限下删除数据方便简单数据稳定性好可行性研究可行性的目的是用最小的代价在尽可能短的时间内确定问题是否能够解决是否值得去解决。可行性分析的任务是明确应有和项目的开发的必要性和可行性。必要性来自实现开发任务的迫切性而可行性则取决于实现应用系统的资源和条件。()技术可行性Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。Java非常适合于企业网络和Internet环境本聊天工具所采用的TCPIP协议、UDP协议和Socket编第二章需求分析程等技术在Java中都能找到很简单的类包来实现。网络上的系统结构多为客户服务器模式服务器端负责数据和图像等的存储、维护、管理以及传递客户端则负责人机界面的操作、送出需求及显示收回的数据。如何使用JAVA来进行网络编程:)由于客户端通过IE同服务器建立联系所以客户端使用Applet服务器端使用Application)服务器应设置成多线程应答多个客户的请求)两端通信使用SOCKET机制。()开发环境可行性)软件环境配置WindowsXP操作系统Java环境JDK以上Oracle数据库系统。)硬件环境配置CPU速度在OOMHz以上(推荐用MB)内存在MB以上第三章系统总体设计第三章系统总体设计本聊天工具采用客户机服务器(CS)的模式来设计是一个层的CS结构:数据库服务器应用程序服务器端应用程序客户端系统采用CS结构可以将任务合理分配到客户机端和服务器端从而降低了系统的通信开销。()客户层客户层也叫应用表示层是应用程序的用户接口部分。给聊天工具设计一个客户层具有很多优点这是因为客户层担负着用户与应用间的对话功能。它用于检查用户的输入数据图形用户接口显示应用的输出数据。为了使用户能直观的进行操作客户层需要使用图形用户接口。若聊天用户变更系统只需改写现实控制和数据检查程序即可而不会影响其他两层。()服务层服务层又叫功能层相当于应用的本体它是将具体的业务处理逻辑编入程序中。例如用户需要检索数据系统设法将有关检索要求的信息一次性的传送给功能层而用户登录后聊天登录信息是由功能层处理过的检索结果数据它也是一次性传送给表示层的。()数据层数据层就是DBMS本聊天工具使用了Oracle数据库服务器来管理数据。Oracle能迅速执行大量数据的更新和检索因此从功能层传送到数据层的“要求”一般都使用SQL语言。主要应用技术本聊天工具的开发采用了TCPIP协议、UDP和Socket编程等技术。TCPIP协议TCPIP是聊天工具建立连接时使用的协议该协议是网络中使用的通信协议包括传输控制协议和网际协议。TCPIP是网络互联的标准协议可使不同环境下不同节点之间进行彼此通信是连入互联网的所有计算机在网络时进行各种信息交换和传输所必须采用的协议。TCPIP实际上一种层次性协议是一组协议的总称他的内部包含许多其它的协议它们组成了TCPIP协议组。UDP协议两个用户聊天期间使用的是UDP协议UDP协议是用来在互联网环境中提供包交换的计算机通信的协议。此协议默认认为网路协议是其下层协议。此协议提供了向另一用户程第三章系统总体设计序发送信息的最简便的协议机制。此协议是面向操作的未提供提交和复制保护。如果应用程序要求可靠的数据传送应该使用上面的传输控制协议。因为聊天期间一般对数据的可靠性要求不高所以是用UDP协议。UDP协议的全称是用户数据报在网络中它与TCP协议一样用于处理数据包。在OSI模型中在第四层传输层处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点也就是说当报文发送之后是无法得知其是否安全完整到达的。)为什么选择UDP在选择使用协议的时候选择UDP必须要谨慎。在网络质量令人不十分满意的环境下UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议因而具有资源消耗小处理速度快的优点所以通常音频、视频和普通数据在传送时使用UDP较多因为它们即使偶尔丢失一两个数据包也不会对接收结果产生太大影响。比如聊天用的ICQ和OICQ就是使用的UDP协议。)怎样在Java中操纵UDP使用位于JDK中Javanet包下的DatagramSocket和DatagramPacket类可以非常方便地控制用户数据报文。在描述它们之前必须了解位于同一个位置的InetAddress类。InetAddress实现了JavaioSerializable接口不允许继承。它用于描述和包装一个InternetIP地址通过三个方法返回InetAddress实例:getLocalhost():返回封装本地地址的实例。getAllByName(Stringhost):返回封装Host地址的InetAddress实例数组。getByName(Stringhost):返回一个封装Host地址的实例。其中Host可以是域名或者是一个合法的IP地址。DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有个构建器:DatagramSocket()创建实例。这是个比较特殊的用法通常用于客户端编程它并没有特定监听的端口仅仅使用一个临时的。DatagramSocket(intport):创建实例并固定监听Port端口的报文。DatagramSocket(intport,InetAddresslocalAddr):这是个非常有用的构建器当一台机器拥有多于一个IP地址的时候由它创建的实例仅仅接收来自LocalAddr的报文。值得注意的是在创建DatagramSocket类实例时如果端口己经被使用会产生一第三章系统总体设计个SocketException的异常抛出并导致程序非法终止这个异常应该注意捕获。DatagramSocket类最主要的方法有个:Receive(DatagramPacketd):接收数据报文到d中。receive方法产生一个“阻塞”。Send(DatagramPacketd):发送报文d到目的地。SetSoTimeout(inttimeout):设置超时时间单位为毫秒。Close():关闭DatagramSocket。在应用程序退出的时候通常会主动释放资源关闭Socket但是由于异常地退出可能造成资源无法回收。所以应该在程序完成时主动使用此方法关闭Socket或在捕获到异常抛出后关闭Socket。“阻塞”是一个专业名词它会产生一个内部循环使程序暂停在这个地方直到一个条件触发。DatagramPacket类用于处理报文它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte。数组。应用程序在产生数据包是应该注意TCPIP规定数据报文大小最多包含个通常主机接收个字节但大多数平台能够支持字节大小的报文。DatagramPacket类的构建器共有个:DatagramPacket(bytebuf,intlength,InetAddressaddr,intport):从Buf数组中取出Len沙长的数据创建数据包对象目标是Addr地址Port端口。DatagramPacket(bytebuf,intoffset,intlength,InetAddressaddress,intport):从Buf数组中取出Offset开始的、Length长的数据创建数据包对象目标是Addr地址Port端口。DatagramPacket(bytebuf,intoffset,intlength):将数据包中从Offset开始、Length长的数据装进Buf数组。DatagramPacket(bytebuf,intlength):将数据包中Length长的数据装进Buf数组。DatagramPacket类最重要的方法就是getData()了它从实例中取得报文的Byte数组编码。基于Socket的编程从概念上理解Socket网络编程中最常见的客户服务器模式也是本聊天工具的基础。以该模式编程时服务器端有一个进程是多个进程在指定的端口等待客户来连接一旦连接成功便按设计的数据交换方法和格式进行数据传输。客户端向服务器端提出连接请求连接之后进行通信。Socket是一种用于表达两台机器之间连接终端的软件抽象。对于一个给定的连接在每台机器上都有一个Socket简单说一台计算机上的Socket第三章系统总体设计同另一台计算机通话创建一个通信信道可以用这个信道在两台机器之间发送数据。()Socket的类型JavaSocket有两种类型在编写本聊天工具时均有用处。)TCPSocket:由Socket类实现。)UDPSocket:由DatagramSocket类实现。TCP和UDP扮演同样的角色即接受传输协议数据包并把他们传递到表示层但是它们的实现方法不同:TCP把信息分解成数据包(Datagram)并在接受端重新组装起来。它还对丢失的数据包进行重新传输的请求。TCP减少了上层的担忧。UDP没有组装和重传请求的功能。它只是传输数据包。更高的层必须确保信息的完整性以及组合顺序的正确性。一般来说UDP使应用程序更有效率但只在应用程序并不是立即交流大量数据并且不需要组装大量的数据包而完成一条信息的时候才采用否则TCP才是最简单和最有效的选择。()怎样使用Socketjavanet包中的Socket和ServerSocket类就是用来实现Socket的编程的。ServerSocket用于服务器端Socket是建立网络连接时使用的。在连接成功时应用程序两端都会产生一个Socket实例操作这个实例完成所需的会话。对于一个网络连接来说Socket套接字是平等的并没有差别不因为在服务器端或在客户端而产生不同级别。()利用Socket进行Java网络编程Socket是网络上运行的两个程序间双向通讯的一端它既可以接受请求也可以发送请求利用它可以较为方便的编写网络上数据的传递。在Java中有专门的Socket类来处理用户的请求和响应。利用Socket类的方法就可以实现两台计算机之间的通讯。这里就介绍一下在Java中如何利用Socket进行网络编程。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象这个对象有两个关键的方法一个是getInputStream方法另一个是getOutputStream方法。getInputStream方法可以得到一个输入流客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流(其实是一个缓冲区暂时存储将要发送过去的数据)。程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装。为了更好的说明问题这里举了一个网上对话的例子客户端启动以后服务器会启第三章系统总体设计动一个线程来与客户进行文字交流。要完成这个工作需要完成三个部分的工作以下依次说明:)建立服务器类Java中有一个专门用来建立Socket服务器的类名叫ServerSocket可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocketserver=newServerSocket()这条语句创建了一个服务器对象这个服务器使用号端口。当一个客户端程序建立一个Socket连接所连接的端口号为时服务器对象server便响应这个连接并且serveraccept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socketincoming=serveraccept()。进而得到输入流和输出流并进行封装BufferedReaderin=newBufferedReader(newInputStreamReader(incominggetInputStream()))PrintWriterout=newPrintWriter(incominggetOutputStream(),true)随后就可以使用inreadLine()方法得到客户端的输入也可以使用outprintln()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。在所有通讯结束以后应该关闭这两个数据流关闭的顺序是先关闭输出流再关闭输入流即使用outclose()inclose())建立客户端代码相比服务器端客户端要简单一些客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后就可以用”建立服务器”部分介绍的方法实现数据的输入和输出。Socketsocket=newSocket("",)in=newBufferedReader(newInputStreamReader(socketgetInputStreamU))out=newPrintWriter(socketgetOutputStream(),true)以上的程序代码建立了一个Socket对象这个对象连接到ip地址为的主机上、端口为的服务器对象。并且建立了输入流和输出流分别对应服务器的输出和客户端的写入。)建立用户界面第三章系统总体设计根据自己的喜好建立自己的用户界面这不是本文的重点。经过以上三个步骤就可以建立一个比较简单的对话程序。但是为了使这个程序更加完善应进行以下几个改进:首先现在服务器只能服务一个客户也就是单线程的。可以将它改进为多线程服务器。Try{file:建立服务器ServerSocketserver=newServerSocket()inti=for(){Socketincoming=serveraccept()newServerThread(incoming,i)start()i}}catch(IOExceptionex){exprintStackTrace()}循环检测是否有客户连接到服务器上如果有则创建一个线程来服务这个客户这个线程的名称是ServerThread这个类扩展了Thread类它的编写方法与前述的服务器的写法相同。其次为了可以随时得到对方传送过来的消息可以在服务器以及客户端各建立一个独立的线程来察看输入流如果输入流中有输入则可以即时显示出来。代码如下:newThread(){publicvoidrun(){Try{while(true){checkInput()sleep()每毫秒检测一次}catch(InterruptedExceptionex)第三章系统总体设计{}catch(IOExceptionex){}}}start()其中的checkInput()方法为privatevoidchecklnput()throwsIOException{Stringlineif((line=inreadLine())!=)file:检测输入流中是否有新的数据tsetPartner(line)file:数据流中的消息显示出来}通过以上改进程序就可以比较好地运行了。(功能模块划分聊天工具按照如下过程完成通信:()客户向服务器注册告知服务器它在监听某主体()客户注册之后向服务器发送消息()服务器再把消息发送给所有监听此主体的客户。功能模块划分如图所示。服务器端功能服务器端完成大功能:建立连接操作数据库监听客户。这三大功能的具体含义如下:()建立一个ServerSocket连接不断侦听是否有客户端连接或者断开连接。()服务器端是一个信息发送中心所有客户端的信息都传到服务器端再由服务器根据要求分发出去。()数据库数据操作包括录入用户信息、修改用户信息、查找好友数据库的资料以及添加好友数据到数据库等。多线程的好处在于可以同时处理多个通信连接不会出现由于数据排队等待而发生的延迟或者丢失可以很好的利用系统的性能。服务器为每一个连接着的客户建立一个线程为了同时相应多个客户端需设计一个主线程来启动服务器端的多线程。主线程与进程结构类似它在获得新连接时生成一个线第三章系统总体设计程来处理这个连接。线程调度速度快占用资源少可共享进程空间中的数据因此服务器的响应速度较快且吞吐量较大。客户端功能客户端完成大功能:新建用户用户登录查找好友聊天通信。这些功能的含义如下:()服务器端建立通信通道向服务器端发送新建用户的信息接收来自服务器的信息进行注册。()与服务器端建立通信通道向服务器端发送信息完成用户登录。()友(添加好友)是客户端必须实现的功能此外用户通过客户端可以查找自己和好友的信息。多线程设计本聊天工具的设计使用了多线程技术。络通信和IO相关操作的类库利用这些类系统。标准的Java包提供了相当完善的针对网可以在很短时间内设计出一个网络交互服务器端的多线程服务器端需要和多个客户端同时进行通信这就是服务器端的多线程。一旦服务器发现一个新的客户端与之建立连接就马上新建一个线程与该客户端进行通信。用多线程的好处在于可以同时处理多个通信连接不会出现由于数据排队等待而发生的延迟或者丢失可以很好的利用系统的性能。服务器为每一个连接着的客户建立一个线程为了同时相应多个客户端需设计一个主线程来启动服务器端的多线程。主线程与进程结构类似它在获得新连接时生成一个线程来处理这个连接。线程调度速度快占用资源少可共享进程空间中的数据因此服务器的响应速度较快且吞吐量较大客户端的多线程客户端能够完成信息的接收和发送操作这与服务器端的多线程概念不同可以采用循环等待的方法来实现客户端。利用循环等待的方法客户端首先接收用户输入的内容并将它们发送到服务器端然后接收来自服务器端的信息将其返回给客户端的用户。第三章系统总体设计第四章系统的详细设计及编码实现第四章系统的详细设计及编码实现(数据库的设计数据库表主要用来存放用户的注册信息和用户的好友资料可利用两张数据库表来用存放用户信息和用户好友资料。在orcale上新建名为javaicq的数据库并建立两张数据库表:用户的基本信息数据库表(表名icq)和用户好友数据库表(表名friend)()icq表icq表存放用户信息包括用户的号码、昵称、密码、在线否状态、ip地址、资料、头像号、性别、Email和籍贯等信息。其中用户昵称和密码是必需的字段号码和是否在线可由系统设置的其余的信息是可选的字段icq表格数据类型如表所示。表用户的基本信息表(表名icq)字段名icqnicknamepasswordstatus数据类型intCharCharBit长度IpinfopicsexemailplaceCharvarcharintCharCharChar()friend表friend表的设计比较简单本系统只设计了用户的号码和好友的号码两个字段如表所示。表用户的好友表(表名friend)字段名Icqfriend第四章系统的详细设计及编码实现数据类型IntInt长度数据库生成表的SQL语言()ifexists(select*fromdbosysobjectswhereid=objectesid(N'dbofriend')andOBJECTPROPERTY(id,N'IsUserTable')=)droptabledbofriendGOifexists(select*fromdbosysobjectswhereid=objectid(N'dboicq')andOBJECTPROPERTY(id,N'IsUserTable')=)droptabledboicqGOCREATETABLEdbofriend(icqnointNOTfriendintNOT)ONPRIMARYGOCREATETABLEdboicq(icqnointIDENTITY(,)NOTnicknamechar()COLLATEChinesePRCCI一SNOTpasswordchar()COLLATEChineseesPRCCIesASNOTstatusbitipchar()COLLATEChinesePRCCIeeASinfovarchar()COLLATEChinesewePRCCIASpicintsexchar()COLLATEChineseeePRCCIASemailchar()COLLATEChineseeePRCCI一Splacechar()COLLATEChinesewePRC一IAS)ONPRIMARYGO第四章系统的详细设计及编码实现服务器的设计主服务器类的设计设计服务器是需要考虑如下因素:服务器的运行速度。服务器的响应速度包括新建连接和发送数据的响应速度。针对TCPIP协议的数据结构设计服务器的程序结构需要考虑如下因素:多线程和多进程。主服务器类实现了服务器端的多线程即使用语句ServerSockets=newServerSocket()在端口创建套接口使用newServerThread(socket)语句创建新的线程。主服务器类调用ServerThread类而每个ServerThead实体就是一个单独的线程即对应于客户端连接请求响应的线程。服务端有一个进程(或多个进程)在指定的端口等待客户的连接信息一旦连接成功就可以按设计的数据交换方法和格式进行数据传输。客户端只在需要的时候向服务端发出连接请求。ServerThread类的设计Serverthread类的函数执行过程可描述如下:执行ServerThread(Sockets)线程构造函数。使用BufferedReader(newInputSlreamReader(socketgetInputStream()))创建输入流。使用PrintWriter(newBufferedWriter(newOutputStreamWriter(socketgetOutputStream()))创建输出流。使用start()函数启动线程。最后使用run()线程监听函数。()新建用户新建用户是网络聊天工具一个基本功能。用户新建过程在线程监听函数run()中。新建用户的过程是这样的:首先要使用CassforName方法加载数据库驱动类该类的描述是sunjdbcodbcJdbcOdbcDriver然后使用DriverManagergetConnection方法连接数据数据库名为jdbc:odbc:javaicq最后服务器接收客户端用户发送的昵称、密码、用户Email、个人资料、籍贯和头像等信息执行数据库添加操作完成用户的创建。服务器为新建的用户指定为的注册号码并将号码以即时消息的方法发送给用户。()登录线程第四章系统的详细设计及编码实现如果客户端输入的字符串表示需登录那么服务器在接受到该信息后连接数据库准备从数据库选择昵称和密码。服务器接收到客户端发送过来的号码和密码信息后设定数据库查询条件并执行数据库查询通过比较输入的用户名和密码和数据库信息来确定用户的登录是否成功。()读取好友资料当用户登录后将显示好友的头像和昵称。用户得到好友列表后可根据需要读取好友的详细资料也可读取用户自己的详细资料。()查找好友当客户端向服务器发送查找好友的请求后服务器立即响应并调用ClassforName方法加载数据库驱动类sunjdbcodbcJdbcOdbcDriver,然后调用方法DriverManagergetConnection完成数据库的连接得到用户好友查询的结果。查询结果包括:好友的昵称、性别、籍贯、个人资料等信息。服务器对数据库的查询结果进行筛选只向客户端的用户返回好友的注册号码、头像信息号以及是否在线信息。客户端接收到查询结果后利用相应的函数将其显示出来。查找好友界面如图所示。图查找好友界面FigFindFriend'sInterface用户在线时数据库表的IP地址字段为此时用户计算机的真实IP地址状态字段为第四章系统的详细设计及编码实现。若用户提出下线服务器只需时完成修改IP字段和状态字段即可。服务器首先里用CassforName方法加载数据库驱动类sunjdbcodbcJdbcOdbcDriver然后通过方法DriverManagergetConnection连接数据库然后根据用户号码将其状态字段设为IP地址字段设为空。()通知好友通知好友也是在run函数中实现的服务器功能。服务器首先连接数据库再根据“我的号码”从好友表中得到我的好友列表然后利用广播通知他们我已经上线了。()删除好友服务器响应客户端用户的请求后首先连接数据库并根据接受的用户号码及好友号码向好友表记录删除。服务器使用保存结果若为则表明删除好友成功服务器给客户端发“okdelfriend”的消息否则删除好友失败服务器给客户端发出“falsedelfriend”的消息。()退出下线(客户端的设计客户通过Socket与服务器建立连接。服务器与客户都通过构造BufferedReader,PrintWriter来建立输入输出流双方通过该输入输出流来相互传递信息。一旦收到客户方的连接请求服务器利用accept()函数返回一个新建的Socket对象然后客户端向服务器发送消息诸如注册、登录和查找好友等请求服务器收到请求后针对不同的消息处理请求。在这一过程中服务器端与客户端采用UDP协议通信。虽然UDP协议不可靠但是对于聊天工具而言可靠性并不太重要。用户注册()注册过程当服务器收到用户的注册请求后开始接受客户传递的信息诸如客户的昵称、性别籍贯、头像和个人资料等信息。接收完毕后服务器便通过JdbcOdbc与后台数据库连接向数据库添加记录其流程如图所示。若新用户注册则向客户返回号码并在数据库中注册用户的IP地址设定Status值告知用户在线(Status设为I)。客户收到服务器返回的信息后打开主程序窗口同时创建UDP以便在用户之间建立联系。()注册事件处理注册事件处理客户端注册的主要部分。Java事件包括键盘事件、鼠标事件和按钮事件。而所使用到的鼠标事件实际就是点鼠标按钮时系统会调用监听器包括第四章系统的详细设计及编码实现mousePressed,mouseReleased,mouseClicked。监听及处理流程如图所示。()注册界面如图所示。用户登录用户在客户端程序中输入用户号码和密码与服务器建立连接向服务器发送登录请求。服务器收到该请求后通过JdbcOdbc读取数据库与用户输入的信息作比较:若用户输入的信息与数据库信息相同则服务器向客户端返回成功消息将其Status字段设为并注册用户当前所使用的IP地址否则服务器向客户端返回失败消息。客户端收到服务器的成功确认后打开聊天主窗口否则弹出失败消息。客户端的事件驱动与服务器端的事件监听相对应。用户登录界面如图所示。第四章系统的详细设计及编码实现第四章系统的详细设计及编码实现第四章系统的详细设计及编码实现主程序设计客户完成登录后客户端与服务器器端建立连接。连接建立成功后客户端向服务器请求读取好友名单服务器收到该请求开始读取数据库中的friend表并得到好友的号码再通过icq表读取好友资料向客户端发送这些信息客户收到服务器信息后在主窗口显示好友(即好友的头像和昵称)。客户端还建立矢量(Vector)来存储好友昵称、JCC号码、头像编号和)P地址等信息。主程序窗口是通过在JFrame对象中添加AWT或者Swing组件而完成的。但是JFrame不是一个容器只是一个框架在其对象中添加组件需要利用其他的办法。JFrame有一个内容面板(contentPane),可将窗口的所有组件都添加在这个面板上并利用JFrame提供的ContentPane和setcontentPane方法完成指定面板的设置。这样通过面板可在JFram。对象中添加所需的组件。主程序界面如图所示。第四章系统的详细设计及编码实现服务器连接服务器连接是在ConnectServer()函数中实现的。本函数用到了具有连续性、有序性特点的流(Stream)根据服务器的IP地址和端口来完成客户端与服务器端的连接。IP地址是网络中唯一的地址标识。服务器连接过程分服务器端和客户端两部分执行流程如下:服务器程序流程(多线程):()程序初始化()填写本机地址信息()收到Client的连接后建立一个Socket连接()产生一个新的进程与Client进行通讯和信息处理()子通信结束后中断与Client的连接。客户端程序流程:()程序初始化()填写服务器地址信息()连接服务器()与服务器通信和信息处理()通信结束后断开连接。消息通信的设计()创建数据报消息的收发主要是通过数据报服务实现的。Java实现数据报通信的构成除了面向连接的Socket还有无连接的数据报Socket。数据报是网络层数据单元在介质上传输信息的一种逻辑分组格式它是一种在网络中传播的、独立的、自身包括地址信息的消息他能否到达目的地到达的事件到达时内容是否会变化是不能准确知道的。数据报的通信双方不需要建立连接对于像聊天通信这些不需要很高质量的应用程序来说数据报通信是一个非常好的选择。如何使用数据报:在Java的javanet包中有两个类DatagramSocket和DatagramPacket它们为应用程序采用数据报通信方式进行网络通讯提供了支持。下面详细解释在Java中实现客户端与服务器之间数据包通信的方法主要介绍客户端应用程序的工作流程:)通信双方要建立数据报通信的Socket。可以通过创建一个DatagramSocket对象来实现它其构造方法有如下两种:publicDatagramSocket()构造一个数据报Socket并使其与本地主机任一可用的端第四章系统的详细设计及编码实现口连接。若打不开Socket则抛出Socketexception异常。publicDatagramSocket(intport)构造一个数据报Socket,并使其与本地主机指定的端口连接。若打不开Socket或Socket无法与制定的端口连接则抛出SocketException异常。然后处理接收缓冲区内的数据获取服务结果。最后当通信完后可以使用DatagrainSocket对象的close方法来关闭数据报通信Socket。当然Java自己会自动关闭Socket释放DatagramSocket和DatagramPacket所占用的资源。)UDP工作流程客户端与服务器之间的数据报通信工作流程与UDP方式下通信流程序差别不大具体分服务器流程和客户流程两部分。服务器程序流程:程序初始化填写本机地址信息邦定一个固定的端口受到Client的数据报后进行处理与通信通信结束后断开连接。客户端程序流程:程序初始化填写服务器地址信息连接服务器与服务器通信和信息处理通信结束后断开连接。)TCP与UDP的区别TCP与UDP的连接区别是:对系统资源的要求(TCP较多UDP较少)UDP程序结构较简单流模式与数据报模式TCP保证数据正确性UDP可能丢包TCP保证数据顺序UDP不保证。两者在编成实现过程中的区别是:Socket()的参数不同UDPSever不需要调用listen和accept第四章系统的详细设计及编码实现UDP收发数据用sendtorecvfrom函数TCP:地址信息在connectaccept时确定UDP:在sendtorecvfrom函数中每次均需指定地址信息部分满足以下几点要求是系统应该采用UDP面向数据报方式:网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重但对影响速度要求高。()发送消息用户通过在好友列表中好友的IP地址利用UDP协议于其他用户进行信息交流。消息发送之前先创建一个数据报文包用来实现无连接的包传送服务。每个数据报文包是用DatagramPacket类来创建的DatagramPacket对象封装了数据报包数据、包括长度、目标地址和目标端口。若客户端要发送数据报文包则构造函数创建DatagramPacket对象将需要发送的数据和报文目的地址信息放入对象之中发送消息窗口如图所示。在发送的过程中利用构造函数DatagramPacket(bytebufferedarray,Intlength,InetAddressaddress,intport)构造了一个包度为length的包它是一个将数据传送到指定主机指定端口号上的数据报文包参数length必须小于等于bufferedarrylength。消息发送是通过调用DatagramSocket对象的send方法实现的它需要以DatagramPacket对象为参数将刚才封装进DatagramPacket对象中的数据组成数据报发出。发送消息流程如图所示。第四章系统的详细设计及编码实现()监听好友的消息当客户线程被创建之后它就在不断监听好友的消息监听好友的消息与QQ好友上线监听功能非常相似。系统首先定义一个空数组该数组用于接收消息中的数据然后创建数据报使用receiveSocketrecerve(DatagramPacket)JAI数的等待并接收数据报取得数据报中的数据。根据取得数据的类型监听器将判定好友是否上线、是否下线、是否发送来消息等。()接收消息DatagramPacket类提供了个函数来获取消息:)PublicbytegetData():返回一个字节数组包含收到或要发送的数据报中的数据)PublicintgetLength():返回发送或接收到的数据的长度)PublicIneAddressgetAddress():返回一个发送或接收此数据报报文的机器IP地址)PublicintgetPort():返回发送或接收数据报的远程主机的端口号。第四章系统的详细设计及编码实现接收消息的流程如图所示。为了接收从服务器返回的结果数据报文包需要创建一个新的DatagramPacket对象。该对象利用了Datagrampacket类的另一种构造方法DatagramPacket(bytebufferedarray,rotlength)即只需指明存放接收的数据报的缓冲区和长度。系统可调用DatagramSocket对象的receiver()函数来接收数据报并将DatagramPacket对象作为该函数的参数。Recerve()方法会一直阻塞直至收到一个数据报文包而该数据存放在DatagramPacket对象的缓冲区中。数据报文包好包含了发送者的IP地址和端口号等信息。接收消息界面如图所示。第四章系统的详细设计及编码实现好友管理()查找好友好友查找可利用FindFriend类完成FindFriend继承自JFrame类。FindFriend中定义的界面空间包括:好友的昵称、性别、住址、Jicq号码、在线状态、头像、电子邮件和个人留言等信息。查找好友所需的网络变量定义如下:)Socketsocket:连接Socket。)BufferedReaderin:读入缓冲区。)PrintWriterout:输入缓冲区。)Intmyid:用户的号码。)Stringserverhost:发送端的主机地址。)Intservport:服务器端的主机地址。)DatagramPacketsendPacket:存储发送消息的发送数据报。)DatagramsocketsendSocket:存储接收信息的接收数据报。)IntsendPort:发送的端口号。()添加好友用户添加好友是聊天工具的基本功能之一。添加好友的基本步骤如下:用户A登录后向服务器发送查找请求服务器响应并读取数据表icq将结果返回给用户用户在收到查询结果后选择用户B向服务器发送添加好友请求服务器收到请求后响应更新数据库表friend并从icq表中读取好友基本信息将信息返回给用户A用户A的客户端主窗口显示用户B并通过UDP通知用户B。用户B受到服务器的确认消息可决定是否添加用户A为好友。()查看好友资料从数据库中读取出来好友的数据之后系统将其存放在friendnames数据结构中。查看功能可通过访问friendnames的成员变量来实现。()删除好友用户可以删除好友列表中指定的好友客户端确认用户操作后向服务器发送删除请求服务器收到该请求连接数据库表friend并删除用户及好友的记录。若删除成功则向客户端返回成功消息通知用户。(系统的使用()服务器启动第四章系统的详细设计及编码实现完成数据库设计后启动数据库服务器在Windows控制台下执行如下命令:)JavacServerjava)JavaServer服务器启动后将显示服务器地址和端口号。()运行客户端在Windows控制台下执行如下命令:)JavacNewjava)JavaNew客户端启动后单击窗口上的新建】按钮进行注册。准确填写自己的信息并选定头像单击【确定】按钮完成注册。服务器收到注册请求后会返回用户的注册号码用户可以用此号码登录进入自己的QQ世界。第五章结论本聊天工具采用客户机服务器(US)的模式来设计是一个层的US结构:数据库服务器一应用程序服务器端~应用程序客户端系统采用US结构可以将任务合理分配到客户机端和服务器端从而降低了系统的通信开销。本聊天工具能够满足基本的聊天要求。按照如下过程完成通信:客户向服务器注册告知服务器他在监听某主体客户注册之后向服务器发送消息服务器再把消息发送给所有监听此主体的客户。主要完成的工作有:()分析了网络即时通讯软件的应用背景。提出了客户机服务器的设计模式。采用CS结构对系统总体设计进行了详细地分析。()根据总体设计结构完成了程序的数据库设计、服务器的设计、客户端的设计。包括实现登录、注册、新建用户、收发信息、音视频的传输等具体程序设计。可以充分实现用户间的信息交流。()本软件在烟台职业学院内部网络上运行情况良好。可以很好地完成用户对即时通讯的基本要求。适用企业、公司等所有内部网络对通讯的要求。网络即时通讯软件在现代企业管理中有着广泛的应用。虽然现在QQ等大众聊天软件很多但它们易受病毒攻击的弱点影响了推广使用本文虽能解决安全性、稳定性问题但是尚有不足的地方在下述方面还有待进一步的发展和完善:()服务器端程序设计。为了能充分发挥CS结构的优势需进一步完善服务器端程序设计功能尤其是操作数据库和监听客户。()异常处理问题。目前本软件系统可以初步的捕获音视频传输中发生的错误和异常并记录异常或错误发生的位置和信息但是没有修复异常或错误的能力相应的处理只能由管理监控工具执行且处理的手段比较单一。这需要根据以后技术的发展以及用户的需求做出改进。参考文献HMDeitelPJDeitel著JAVA程序设计高级教程Vi一导引北京:电子工业出版社,马增辉解建仓王少波基于JEE技术的工作流管理系统的研究与实现计算机工程与应用,():范玉顺面向服务的企业建模和工作流管理研究中国计算机学会通讯,():,杨芙清软件工程技术发展思索软件学报,(l):熊小敏刘瑛陈惠清基于Java的网络即时通讯系统的设计与实现计算机与现代化,():翟高粤基于Java语言SocketCS通信的实现方法J甘肃科技纵横():,柴振荣用Java语言书写的程序的快速编译J管理科学文摘():李斌Java语言的特点Jl管理科学文摘():Nathanael,Paul,DavidEvansComparingJavaandNETsecurityLessonslearnedandmissedPublisher:ElsevierScience,():一JoumalJournaloftheAssociationforVascularAccessContinuingEducationQuestions一SummerJAVAAssociationforVascularAccess,,():一JohnWileyAninformationbrowsingsystemusingaJavabasedcellularphoneinaremotedisplayenvironmentSystemsandComputersinJapan,,():一BorisRoussev,JieWuDistributedcomputingusingJavaAcomparisonoftwoserverdesignsElsevierScience,JournalofSystemsArchitecture,,():TetsuyasuYamada,ShinjiTanaka,SatoshiShiraishiDynamiccodereorderingmethodforprovementofJavaElectronicsandommunicationsinJapan(Part:Communications),,():MarkMoir,NirShavitJanVitekConcurrencyandsynchronizationinJavaprogramsScienceofComputerProgramming,,():PeterMaresArtofJavaWebDevelopmentTheComputerJourna,,():AlmutHerzog,NahidShahmehriPerformanceoftheJavasecuritymanager(java安全管理的实行)ComputersSecurity,,():,致谢感谢教研室老师和同学们给予我的多方支持和帮助。感谢支持、关心和鼓励我完成学业的亲人们。是他们的大力支持和帮助使我顺利完成了学习任务。最后感谢百忙之中为我的论文审稿的各位老师

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/52

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利