10 3需求分析
输不会因为数据封装问题出现丢失或乱码。因用户的误操作产生的异常应做出及时的处理或信息提示。 (2)稳定性需求:
软件应正常完成所有功能需求。服务器端应长时间运行无故障,故障修复时间一般控制在3小时内,除非出现恶性攻击、病毒破坏、系统资源不足、硬件故障、操作系统或数据库系统崩溃网络中断等情况,要求系统连续运行一周,不允许出现内存泄露。要求系统可以承受告警风暴和大数据量的冲击,不出现内存溢出等现象。 (3)软件设计需求:
要确定合适的模块粒度,各模块之间要求松耦合,高内聚;从而使整个系统的可靠性和稳定性得到提高,并且便于系统维护,和新模块的添加。
安全性:安全性是防止网络方面的攻击。
扩展性:系统建成后,应在现行系统上不需要做大的改动或不影响整个系统结构,就可以增加功能模块,这就必须在系统设计时留有接口,使其具有可扩展性和维护性。
易用性: 系统操作的界面必须简洁、操作方便易用、设计合理。
基于JAVA聊天室的设计与开发 11
4概要设计
4.1系统的代码结构
本系统的原程序几乎全部有代码构成,一个可分为四个部分,Server、New、Register和MainWin。用其中的两个表qq和friend来存取程序所用到的一些信息。服务器端用Server来执行,客户端用New来执行,其它的两个类都是被调用的。下面我就对各个部分进行一下详细说明。
4.2主程序类的设计(MainWin类)
本部分是整个系统中最大的部分,但它们并不被直接执行,而是通过别的类来调用。它的主要作用是桥梁作用,里面定义的都是监听事件,当客户端要做某种操作时都可以被该类中相应监听事件所捕捉,然后监听事件对所捕捉到的客户端的操作进行相应的处理。该部分能实现好友查找,建立创建列表类,处理列表类和发送信息类来组成。 (1)创建列表类
这个类包括好友列表和用户的功能列表。这两个列表的布局是一样的,都是空布局,然后一个一个的把控件添加上去,每添一个都要把坐标值付给主容器即主窗体,以便在相应的位置上显示这个控件。 (2)查找好友类
查找好友实际上就是要对数据库进行查询操作,其实现方法是通过Server类来做的。通过数据库的查询可以直接显示出其他用户的呢称,性别和所在省份。 (3)收发信息类
本系统主要部分尤其是难点都在网络传输上,所以发送信息部分就比较主要,它可以说是这个程序的一个标识。
发送信息是通过UDP协议直接向其他用户发送出去的,接收信息是在MainWin类里,用多线程里的无限监听方法,随时等待接收其他用户传来的信息。
4.3多线程的设计
服务器多线程详细设计:
主服务器类调用ServerThread类来实现服务器端的多线程,而每个ServerThread实体就是一个单独的线程,即对应于客户端连接请求响应的线程。服务器端总有一个线程在指定的端口等待客户的连接信息,即使用ServerSocket s=new ServerSocket(8080)语句在8080端口创建套接口;当有客户端申请连接时使用new ServerThread(socket)语句
12 4概要设计
创建一个新的线程来和客户端建立连接。
ServerThread类的构造,首先创建ServerThread(Socket s)线程的构造函数再通过Socket=s来取得ServerThread(Socket s)的传递函数,同时使用BufferedReader(new InputStreamReader(Socket.getInputStream()))来创建。最后使用start()函数启动这个线程;使用run()来监听已经连接的线程。
客户端的多线程设计:
客户端的多线程设计和服务器端的不同,客户端是用多线程里的无限监听方法,随时等待接收其他用户传来的信息。当然客户端是调用Thread类来实现多线程的,用run()方法来提供监听,然后创建一个异常来处理当有好友连接时出现的各种情况,如,好友上线,好友下线,有好友添加你为好友,有好友给你发送消息等等。
4.4服务器端的设计 (Server类)
服务器的工作主要是处理客户端与数据库的数据传递。一方面要对客户端提出的申请做出应答,另一方面要对数据库进行相应的操作。所以,与数据连接的语句全在Server里,这样无论对调试还是运行都比较方便。
但Server类主要处理这些连接工作,对数据的具体操作几乎没有,能看到的只是在DOS界面的一些文字显示而已。例如,申请号码成功就要是要在Server端显示出申请成功,并显示出所申请的号码;添加好友时要显示好友的号码,并显示是否添加成功。
Server类主要是对客户端提出的申请做出回应,有login登录,new新建,find查找好友,friend读取好友资料,addfriend添加好友,delfriend删除好友,logout退出程序,getwhoaddme上线的时候通知好友。
由于Server只需处理客户端的申请和连接数据库,就没有必要在用窗体来显示了,所以我只把服务器端的响应在DOS界面中打印出来,无论是什么样的申请,做出什么样的应答,在服务器端都会有所显示,让用户清楚的看到。
Server端执行的是一个无限监听的过程,它要随时等待客户端说发出的申请。即使完成了一个申请,也要继续等待处理下一个申请,直到Server的退出Server类结构。
功能说明:
Server类是处理客户端和数据的连接工作的,同时也要对客户端的请求做出回应。 start()是线程的启动方法。
run()线程的运行方法,里面是程序的主要部分,用于做出服务器的所有回应。
4.5消息通信的设计
本系统中通信主要是通过数据报服务来实现的,Java实现数据报通信的过程除了面向连接的Soket外,还有无连接的数据报Soket。数据报是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的
基于JAVA聊天室的设计与开发 13
消息,它能否到达目的地,到达的时间,到达的内容是否回变化是不能准确知道的。数据报的通信双方不需要建立连接,对于像聊天通信这些不需要很高质量的应用程序来说,数据报通信是一个很好的选择。
在Java的API函数中有Java.net这样包,此包中有两个类DategramSocket和DategramPacket,他们为应用程序采用数据报通信方式进行网络通信提供了支持,本系统对数据流的操作主要用这两个类。
工作流程是这样的,首先通信双方要建立数据报通信的Socket。可以通过创建DategramSocket来实现它,其构造方法有以下两种:
(1)Public DategramSocket() 构造一个数据报Socket,并使其与本地主机任一可用的端口连接。若打不开Socket则抛出SocketException异常。
(2)Public DategramSocket(int port) 构造一个数据报Socket,并使其与本地连接主机指定的端口连接。若打不开Socket或Socket无法与指定的端口连接则抛出SocketException异常。
然后,处理接受缓冲区的数据,获取服务结果。最后,当处理完缓冲区的数据,可以使用DategramSocket对象close()方法来关闭数据包通信Socket。
14 5系统的实现
5系统的实现
5.1主程序类的实现
主程序是利用MainWin类来实现的,虽然主程序类并不被直接执行但是由于所有的事件处理都在这个类中实现所以主程序类包含大量的成员变量,可分为三大块,第一是保存好友基本信息所有变量的定义,第二是用于临时变量保存临时好友也是用户的基本信息和一些数组的指数,第三是网络相关变量,再加上程序界面变量就是在此系统中用到的所有变
5.2多线程的实现
服务器端的多线程是通过Java提供的API函数中的ServerThread类来实现的,用run()方法来监听线程,当监听到有客户端申请连接时用start()方法来启动一个新线程用来和这个客户端建立连接,同时当有新的客户端申请连接时服务器端会再用start()方法启动一个新的线程再与这个新的客户端进行连接,这样就可以实现了服务器端的多线程。如图5-1所示:
图5-1服务器端多线程