题 目: J2SE畅聊应用系统的设计与开发
系 名: 信息工程系
专业班级:
姓 名:
学 号:
指导教师:
2011年 7 月 1 日
课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位:
设计题目:J2SE畅聊应用系统的设计与开发
初始条件:
《J2SE畅聊应用系统》是一个可以群发和私聊的微型聊天室系统。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
使用JAVA SE开发一个微型聊天室系统, 该聊天室系统包括客户端和服务器端。本系统使用JAVA SWING技术进行前台用户界面的设计和开发, 使用Socket 与 ServerSocket网络编程进行客户端与服务器端的连接与通信,使用输入输出流进行客户端与服务器端之间的数据传输。用户可以登录系统,登录的用户将可以进行群发和私聊的功能。
系统总体功能如下:
主要任务:
| 编号 | 功能名 | 功能描述 |
| 1 | 登录系统 | 运行系统,输入用户名和密码后,进入系统 |
| 2 | 群发 | 客户端发送的信息被服务器发送并显示到其他所有登录的用户的客户端。 |
| 3 | 私聊 | 可以选择跟登录的某个用户进行私下聊天。 |
一、课程设计说明书(或报告书)正文内容
【设计题目】例如:宣传小报的设计排版
【开发环境】硬件环境:微机系列,内存在1G以上,软件环境:Microsoft Windows XP
【开发工具】 word 2000
【完成时间】 2008-1 –11-----2008.1.17
【需求分析】分析阐述用户的管理需要以及对应到要实现的管理系统应具有什么样的功能。【系统总体设计】
在明确了所要解决的问题后,很自然地就要提出自己解决问题的思路和方案。让读者了解方案的总体设计和关键技术。
要阐述自己的设计方案,说明为什么要选择或设计这样的方案。
具体包括:系统总的设计思路,体系结构, 总体架构, 功能模块图;
各功能模块所要达到的设计目标的简单介绍;
设计的数据字典(数据库、表的结构);
使用的设计软硬件环境和开发技术和平台等。
【系统详细设计】
在这部分中,要将整个开发工作的内容进行详细的介绍。
一般按照功能模块分成几部分来介绍。每部分应包括文字叙述、界面图片、关键实现技术(操作或代码)等几个方面综合说明问题。
【系统调试和测试】
调试:介绍设计过程中遇到的问题和解决方法。
测试:介绍如何测试系统,测试中发现的问题和解决方案。
【结束语】
这部分篇幅不大,对整个设计中做的工作、获得的成果、心得体会等做一个简单小结。
【参考文献】罗列在设计过程中查阅的文献名称
注意:参考文献罗列的格式为
资料编号•作者姓名•文献或期刊名称•出版社名称,文献的出版时间或期刊的期号
例如:文献 [1] 蒋加伏.计算机文化基础.北京:北京邮电大学出版社,2004年5月
期刊 [2] 于振海.office XP网上数据存取.计算机应用文摘,2003,24;69(页)
二、课程设计说明书(或报告书)正文的书写格式简介
一、正文标题层次 正文题序层次是文章结构的框架,一般采用社会通用的论文书写形式。即章条序码统一用阿拉伯数字表示,题序层次可以分为若干级,各级号码之间加小圆点,末尾一级的后面不加小圆点,层次分级一般不超过四级为宜,示例如下:
| 第一级(章) | …… | |||
| 第二级(条) | 1.1 1.2… | 2.1 2.2 … | 3.1 3.2 … | …… |
| 第三级(条) | 1.1.1 1.1.2 … 1.2.1 1.2.2… | 2.1.1 2.1.2 … 2.2.1 2.2.2… | 3.1.1 3.1.2 … 3.2.1 3.2.2… | …… |
例如:表1.1 XXXX ,且表题与表序应写在表格的上方正中处。
三、插图 插图图面要整齐、美观,插图应与正文呼应,不能脱节。每幅插图应有图序与图题,图序编号要连续,图序与图题间空一格且要放在插图下方居中处。
四、公式 公式应另起一行写在稿纸的。
时间安排:
| 日期 | 任务 | 课程内容 |
| 2011.6.27 | IO流基础知识讲解 | 低级流、高级流的定义,各自的区别,实际的应用操作等内容 |
| 2011.6.28 | Socket通信基础 | 本章内容的讲解以实例的形式体现网络间的相互通信 |
| 2011.6.29 | GUI界面设计、 事件监听 | SWING的界面设计、事件监听知识的讲解。 |
| 2011.6.30 | 应用系统开发 | 《J2SE畅聊应用系统》的开发 |
| 2011.7.1 | 应用系统开发及验收 | 《J2SE畅聊应用系统》的开发及验收 |
系 主 任 签 字: 2011 年 6 月 24 日
设计过程及答辩回答问题记载:(至少三个问题)
问题1:当我们同时打开群聊和私聊窗口时,只能有一个窗体有效,另一个窗体失效(阻塞)
解决方法:使用多线程来开启对话窗体
问题2:当我们群聊的时候,私聊窗体可以收到群聊的信息.
解决方法1:可以将群聊和私聊写在2个不相同的服务端口中。
解决方法2:将我们的群聊和私聊方法尽量分开来写,群聊的对话框,
私聊的对话框不使用同一段代码,或者使用标志变量作为分发点.
将群聊和私聊隔开
问题3:flush方法的作用是什么
| 解决方法:flush方法,是将缓存中的信息赶出到流中,以便将信息写入相应的数据源中 |
签名:
2011 年 7 月 日
1.需求分析
1.1基本功能需求
(1)用户登录
在用户登录界面,用户输入自己的用户名,密码,然后点击登录按钮(submit),登录成功后,此界面会自动和聊天界面链接。
(2)用户注册
当用户在此界面点击注册按钮(rejister),会链接到注册界面,让用户填写基本信息。让背后点击提交按钮,会在相应的文件夹下增加注册用户的基本信息。
(3)聊天界面
用户可以在聊天界面发送自己的信息,实现私聊和群聊。.
(4)好友界面
在此界面显示了群聊和私聊的用户名。点击用户名会弹出相应的聊天界面。
2.设计思想
在互联网上,传统的网站或用户都使用类似于Email(电子邮件)的形式互相发送信息来进行一系列的交流.但这种异步交互的办事效率可见是很低的.为提高效率,让用户之间能达到实时交互的目的,所以出现了可以实时交流信息的聊天室,来满足用户的需求
3.实现聊天系统的需求分析
采用c/s结构,考虑共有6个需求:
(1)建立侦听服务
这个需求是服务器端的需求。
(2)用户登录
包括客户端请求登录以及服务器端响应登录两个过程。
(3)收发聊天信息
包括客户端发送聊天信息以及服务器端转发聊天信息两个过程。
(4)收发系统信息
由服务器端发送给客户端的信息。
(5)用户下线
包括客户端请求下线以及服务器响应请求两个过程,这个与用户登录类似。
(6)服务器关需要完成的任务
3.开发工具和相关技术简介
(1)JavaScript
Java Script是由Sun公司及网景Netscape公司开发的.它可以让你设计交互的网页内容,但不能单独执行, 必须在浏览器或服务器上执行 。Java具有强大的网络编程功能,它提供了了基于Socket的通信方式(Socket-based communication),使得应用程序可以像读写文件一样Socket读取数据和向Socket写入数据 。
(3)Java实现简单的服务器和客户端
利用Java实现一个简单的服务器需要5个步骤;
第一步,创建一个serversocket类的对象。
第二步,建立侦听。建立侦听是由serversocket类的socket函数完成。
第三步,获取用于与远程客户端通信的outputstream对象和intputstream对象。
第四步,利用objectoutput stream类的writeobject函数,进行数据的准备,并利用objectoutput类的 flush函数,将函数发送出去。
第五步,当传输结束后,调用socket的close方法,关闭连接。 利用Java实现一个简单的客户端需要4个 步骤;
第一步,创建socket类对象,用做连接套接字。
第二步,绑定和连接的套接字。用于数据的发送与接收。
第三步,获取用于与远程服务器通信的outputstream对象和intputstream对象。
第四步,当客户端完成通信,通过socket的close方法关闭连接。
1.2性能需求
尽量减小服务器的开销和数据传送负担,提高数据利用效率和数据传送效率,避免无效数据的传输。
1.3界面需求
界面友好,聊天对话框线程支持,实现无数量用户聊天。服务器端无特殊要求。
1.4用户需求
随着科技的进步,计算机网络的发展日新月异。Intenet在人们的心中地位也越来越重要。其中在线聊天系统尤为重要,也是人们最早在网络的接触到的。在线聊天系统是互联网站一种极为常见的互动沟通交流服务.聊天系统可以向网友提供开放性的聊天服务,网友们可以在此互相发表自己的某些观感,交流某些技术,经验乃至人生的感悟与忧欢,结交更多的朋友。在互联网上,传统的网站或用户都使用类似于Email(电子邮件)的形式互相发送信息来进行一系列的交流.但这种异步交互的办事效率可见是很低的.为提高效率,让用户之间能达到实时交互的目的,所以出现了可以实时交流信息的聊天室,来满足用户的需求。
2.系统总体设计
2.1聊天系统运行原理
聊天系统最基本的原理就是: 从客户端收集消息,然后 通过服务器端消息分发程序中转,将全局消息发送给的所有用户.
2.2网络聊天程序的功能和主要技术
基于TCP协议的网络聊天程序必须包括服务端和客户端两个程序,其中一台计算机上运行服务端程序,在创建服务端程序时,设置一个监听端口(ClientCenter)并调用listen方法。当客户端连接时(connect)就会触发connection request事件,在connection request事件中调用socket方法建立连接,同时在服务端的 事件中,把接收到的客户端传来的数据,转发给所有客户端。
对 于客户端程序必须知道服务端计算机名或其IP地址(Remote Host属性),以及服务端监听端口(Remote PORT属性)然后调用connect方法建立连接任何客户端一方都可以发送.接收对方数据。其中数据调用ClientCenter事件,在ClientCenter事件中的receiveFromServer方法就可以获得传送来的数据。
2.3.聊天系统的功能分析
聊天系统的功能需求进行分析,首先,聊天系统采用c/s架构,由服务器和客户端组成。聊天系统服务器必须具有以下功能:
(1)启动服务器,建立侦听,接受客户端连接
(2)接收.分析.转发聊天信息
(3)向客户端发送系统信息
(4)关闭服务,并向客户端发送服务器关闭消息。
为实现以上4种聊天服务器功能,需要建立以下四个类。
(1)用户信息类(GetUserInfor)(SetUserInfor):该类连接一个文本框,用于保存用户信息。
(2)服务器主框架类(lunchServer):主框架类不仅提供了服务器的人机交互界面,而且在其中实现了服务器的启动和关 闭以及服务器系统消息的发送功能。
(3)服务器侦听线程类(serverCenter):该类的父类为Thread类,它负责接收客户端的信息,并且对信息类型作出判断和 相应的响应。比如,当它收到客户端下线信息,就会调用相应的函数,响应用户下线的请求。
聊天客户端必须具有以下功能:
(1)连接服务器,发送用户登录请求。(2)向服务器发送聊天信息(3)接收服务器转发的聊天信息(4)接收服务器发送的系统信息(5)响应服务器关闭通知消息。
为实现以上5种聊天客户端功能,需要建立一个类。
(1)客户端类(ClientCenter):客户端主框架类除了完成与用户的交互作用外,它还实现了用户的登录与下线的功 能,以及聊天信息的发送功能(sentToServer)。接受信息方法(receiveFromServer)在该类中实现了信息接收的功能。该线程一经启 动,就一直处于接收信息的状态,直到用户下线或服务器关闭。其中响应服务器关闭的功能也是在接收线程类实现的。
2.4功能结构体系图
2.4.1登陆界面与聊天服务器之间的交互图
图2—1 登录界面交互图
2.4.2注册界面与聊天服务器之间的交互图
图2—2 注册界面交互图
2.4.3聊天界面与聊天服务器之间的交互图
图2—3 聊天界面交互图
2.4.4 C端和S端是通过网络交互的,其基本原理如图1所示:
图2—4 C/S通讯基本原理图
3.系统详细设计
3.1服务端设计
功能描述:
1.接受用户注册信息并保存在一个基于文件的对象型数据库。
2.能够允许注册过的用户登陆聊天界面并可以聊天。
3.能够接受私聊信息并发送给特定的用户。
4.服务器运行在自定义的端口上。
5.服务器监控用户列表和用户聊天信息(私聊除外)。
6.服务器踢人,发送通知(可选)。
7.服务器保存日志(可选)。
关键代码如下:
//写服务器
public static void main(String[] args){
list = new ArrayList map = new HashMap //创建指定端口的服务器 try { ServerSocket server = new ServerSocket(); LunchServer ls= new LunchServer(); while(true){ //accept方法当没有客户端连接时,一直处于阻塞状态,当获得连接时才会运行以下代码 //HelloWorld hw = new HelloWorld(); Socket soc = server.accept(); //sendOnLine(soc); new Thread(ls).start(); list.add(soc); String ip = soc.getInetAddress().toString(); map.put(ip, soc); System.out.println(soc.getInetAddress()); ServerCenter sc = new ServerCenter(soc,list,map); new Thread(sc).start(); } } catch (IOException e) { e.printStackTrace(); } } //向整个局域网发送上线通知 public void sendOnLine(){ try { //BufferedWriter bw =null; System.out.println(list.size()); for(Socket s:list){ BufferedWriterbw=newBufferedWriter(new OutputStreamWriter(s.getOutputStream())); bw.write(s.getInetAddress().toString()+"\\r\\n"); bw.flush(); } } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { sendOnLine(); }} 3.2客户端设计 客户端实现的关键在于接收线程的实现 关键代码如下: public class ClientCenter implements Runnable{ private Socket socket; private TextArea ta; public ClientCenter(){} public ClientCenter(Socket socket) { super(); this.socket = socket; } public TextArea getTa() { return ta; } public void setTa(TextArea ta) { this.ta = ta; }//发送信息+ public void sentToServer(String msg){ try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //因为BufferedReader读取信息是以行为单位,“\\r\\n”表示的是回车换行,是一行的结束标志, //如果没有“\\r\\n”,BufferedReader中的readLine不能识别一行的结束,所以他会一直等待一个结束符,之后才会将信息读出 bw.write(msg+"\\r\\n"); //flush方法,是将缓存中的信息赶出到流中,以便将信息写入相应的数据源中 bw.flush(); } catch (IOException e) { e.printStackTrace(); } } //接收信息的方法 public void receiveFromServer(){ try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = ""; while((str=br.readLine())!=null){ System.out.println(str); if(str.startsWith("/")){ System.out.println("当前上线的链接者:"+str); //LoginWindow.showUser(str); } else{ System.out.println(""+str); ta.append(str+"\\r\\n"); }} } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { receiveFromServer(); } 3.3用户登陆界面 用户在此界面可输入用户名(username),密码(password),再点击提交(submit)按钮可已连接到好友界面。关键代码如下: public class GetUserImfo { Map public Map getUser(){ //流 try { //map对象 map = new HashMap //字节流 FileInputStream fis = new FileInputStream("F:\\xt"); //字节流转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String str = ""; while((str = br.readLine())!=null){ System.out.println(str); String[] ss = str.split("_"); // System.out.println(ss[0]); // System.out.println(ss[1]); map.put(ss[0], ss[1]); } fis.close(); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } public static void main(String[] args){ GetUserImfo gui = new GetUserImfo(); gui.getUser(); }} public void actionPerformed(ActionEvent e) { try{ System.out.println("点击了一下按钮"+e.getActionCommand()); String comand = e.getActionCommand(); if(comand.equals("submit")){ String usern = textField.getText(); String userpass = new String().valueOf(password.getPassword()); String passT = map.get(usern); if(passT.equals(userpass)){ //让窗体消失,并释放所占用的资源 frame.dispose(); //以下调用的方法是好友显示面板启动的方法 indexWindow(); }else{ System.out.println("登陆失败"); } 效果如图所示: 图3—1 用户登陆界面 3.4注册界面 用户在登陆界面点击注册按钮(register),会自动弹出注册界面,在注册界面,用户可以填写自己的基本信息,用户名,密码,确认密码,性别,然后点击提交按钮,系统会自动把用户信息添加到相应的文件夹下。关键代码如下: public class SetUserInfor { public void setUser(String user,String password) { BufferedWriter out = null; try { out = new BufferedWriter(new FileWriter("f:\\xt", true)); out.write(user+"_"+password+"\\r\\n"); out.flush(); out.close(); } catch (IOException e) { // error processing code } } } if(comand.equals("提交")){ String nameLabel1=textField.getText(); String passLabel1=new String().valueOf(password.getPassword());//字符型 v.setUser(nameLabel1,passLabel1); JOptionPane j=new JOptionPane(); j.showMessageDialog(frame,"恭喜你,注册成功"); frame.setVisible(false); } else if(comand.equals("取消")){ System.exit(0); } 效果如图所示: 图3-2 用户注册界面 3.5好友界面 在用户成功登陆后会自动进入好友界面,在好友界面中,可以将聊天对象进行分组,有群聊和私聊。点击群聊天会弹出群聊天界面,点击我的好友,会弹出私聊界面。实现群聊和私聊主要用到了标志变量(flag),标志变量作为分发点将群聊和私聊隔开。私聊是遍历用户的IP地址,然后再将不需要的接受消息的IP remove掉。具体代码如下: //登陆后的显示界面 public void indexWindow(){ frame = new JFrame(); frame.setTitle("软帝局域网聊天系统"); frame.setBounds(500, 10, 200, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null); frame.getContentPane().setBackground(new Color(200,200,200)); //在frame中添加一个JPanel面板,实现背景图片方式显示 panel_1 = new JPanel(){ private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g){ super.paintComponent(g); image_1.paintIcon(this, g, 0, 0); } }; //在面板中添加一个树Tree rootNode = new DefaultMutableTreeNode("[- 软帝局域网聊天工具 -]"); friendNode = new DefaultMutableTreeNode("[- 我的好友 -]"); groupNode = new DefaultMutableTreeNode("- 软帝群聊天室 -"); DefaultMutableTreeNode childNode = new DefaultMutableTreeNode("/172.17.5.104"); rootNode.add(groupNode); rootNode.add(friendNode); friendNode.add(childNode); //将节点添加到JTree中 tree = new JTree(rootNode); tree.setForeground(Color.RED); //设置Tree是否透明,透明是false;不透明是true; tree.setOpaque(false); panel_1.add(tree); //给Tree加上监听 tree.addTreeSelectionListener(this); //将JPanel面板添加到Frame中 frame.setContentPane(panel_1); frame.setVisible(true); try { System.out.println("indexwindow"); socket=new Socket("localhost",); cc = new loginWindow.ClientCenter(); //以下启动的线程是客户端接收服务器端信息的方法 new Thread(cc).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 效果如图: 图3-2 好友界面图 3.6群聊界面 系统实现群聊,主要是在服务器端写入群聊方法,(sendMsg),然后用缓冲字节流定义一个对象,这个对象调用方法获得IP地址,最后清空缓存。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Message对象。最后套接字传送到客户端。 关键代码如下: public void valueChanged(TreeSelectionEvent e) { Object[] ob = e.getPath().getPath(); //去数组最后一位,即我们点击的内容 str= new String().valueOf(ob[ob.length-1]); if(!nodeList.contains(str)){ nodeList.add(str); if(str.startsWith("[")){ }else if(str.startsWith("-")){ //~~~~~~~~~~~群聊~~~~~~~~~~~~~~~~~ //System.out.println(ob[ob.length-1]); lunchWindow(str); } class ClientCenter implements Runnable{ public void sentToServer(String msg){ try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //因为BufferedReader读取信息是以行为单位,“\\r\\n”表示的是回车换行,是一行的结束标志, //如果没有“\\r\\n”,BufferedReader中的readLine不能识别一行的结束,所以他会一直等待一个结束符,之后才会将信息读出 bw.write(msg+"\\r\\n"); //flush方法,是将缓存中的信息赶出到流中,以便将信息写入相应的数据源中 bw.flush(); } catch (IOException e) { e.printStackTrace(); } //群聊方法 public void sendMsg(String str){ try { for(Socket soc:list){ BufferedWriterbw=newBufferedWriter(new OutputStreamWriter(soc.getOutputStream())); bw.write("IP("+this.soc.getInetAddress()+"):"+str+"\\r\\n"); //清空缓存 bw.flush(); } } catch (IOException e) { e.printStackTrace(); } } 效果如图所示: 图3-3 群聊界面图 3.7私聊界面 系统实现私聊,在服务器端写入一个oneToOne的方法,该方法遍历map集合,将获得的IP地址写入,然后清空缓存, 当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Message对象。然后系统从Message中提出消息类型,再根据类型将消息强制转化receiveFromServer,调用receiveFromServer中方法,获取目的客户名称列表,根据目的地用户名从用户名、socket键值表中获取socket,再通过socket将Message转发到目的客户。 关键代码如下: else if(flag){ System.out.println("私聊~~~~~~~~~~~~"); for(int i=0;i System.out.println(list.get(i).getInetAddress()); list.remove(i); break;} }oneToOne(ip,str); }} public void lunchWindow(String username){ JFrame lunchW = new JFrame(); lunchW.setTitle("正在与【"+username+"】聊天"); lunchW.setBounds(100, 100, 500, 400); lunchW.getContentPane().setLayout(null); JPanel panel = new JPanel(null){ private static final long serialVersionUID = 1L; @Override protected void paintComponent(Graphics g){ super.paintComponent(g); ImageIcon image= image.paintIcon(this, g, 0, 0); } }; //私聊方法 public void oneToOne(String ip,String msg){ //遍历map集合 try { // Set key = map.keySet(); // Iterator it = key.iterator(); // while(it.hasNext()){ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(map.get(ip).getOutputStream())); bw.write("IP("+this.soc.getInetAddress()+"):"+msg+"\\r\\n"); //清空缓存 bw.flush(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch(NullPointerException e){ System.out.println("没有此人"); //接收信息的方法 public void receiveFromServer(){ try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = ""; while((str=br.readLine())!=null){ System.out.println(str); if(str.startsWith("/")){ System.out.println("当前上线的链接者:"+str); DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(str); rootNode.add(groupNode); rootNode.add(friendNode); //friendNode.add(childNode); friendNode.add(childNode); panel_1 = new JPanel(){ private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g){ super.paintComponent(g); image_1.paintIcon(this, g, 0, 0); } }; //将节点添加到JTree中 tree = new JTree(rootNode); tree.setForeground(Color.red); //设置Tree是否透明,透明是false;不透明是true; tree.setOpaque(false); panel_1.add(tree); //给Tree加上监听 tree.addTreeSelectionListener(lw); //将JPanel面板添加到Frame中 frame.setContentPane(panel_1); frame.setVisible(true); //LoginWindow.showUser(str); } else{ System.out.println(""+str); showMsg.append(str+"\\r\\n"); } } } catch (IOException e) { e.printStackTrace(); }} 效果如图所示: 图3-4 私聊界面图 4.系统调试和测试 4.1测试环境 客户及服务器机操作系统:Window XP,内存:512M。 客户端程序安装在客户机(至少2台)上,通过以太网(网速至少10M)与服务器相连。 前置条件: 1 注册文件已创建但为空。 2 客户及服务程序安装配置正确,能正常启动运行。 3 客户程序与服务程序能通过网络互通。 一 初始化数据 1 客户端启动,进入注册界面,输入正确的注册数据,请求注册,查看服务端,看是否正确注册。 2 重复1,在另一客户端注册用户,注意不要重名。 4.2功能测试 1 注册测试。(1)测试重名注册。进入注册界面输入重名用户名,其它正确,请求注册。(2)测试空输入,进入注册界面,直接按注册按钮。(3)测试口令的一致性,口令长度,年龄及邮箱的数据有效性(具体测试用例设计可参考需求分析及详细设计中的相关部分)。 2 登录测试。(1)输入正确的口令和密码,按登录按钮(2)空输入,直接按登录按钮。(3)分别输入用户名不正确但密码正确,用户名正确但密码不正确,用户名和密码均不正确,应均不能正确登录。(4)以同一用户名重复登录一次 测试(1)(3)时要查看服务端的显示 3 发送接收测试。(1)进入收发界面,群发一条消息,观察其它客户是否收到消息,察看服务器有无相应显示 (2)私聊一条消息,察看指定用户是否收到消息 (3)无任何输入,直接按发送。(4)退出系统,察看服务端显示,察看其它客户端是否已将该客户名删除。(5)再启动客户端,登录进入收发界面,连续群发(至少3次),连续私聊(至少3次),再连续群发,观察其它客户及服务方的显示是否正确。 4.3可靠性测试 1 切断一客户至服务器的网络连接,分别进行注册、登录消息,客户端应能给出提示,而不是死机或退出,在正常聊天过程中,切断一客户端网络连接,客户程序应能给出提示。再接通网路,继续发送信息,应能正常运行。至少关闭并重启程序后,应能正常收发。同时观察其它客户及服务器收发、客户列表是否正常。 2 在正常收发中,强行关闭服务器,观察各客户端的反应。客户端应给出发送异常提示,不应退出或死机。 5.结束语 本项目是基于C/S结构的网络开发,具有一定的典型性,涉及到的C/S多线程编程模式,应用协议的设计,收发信息的方式是类似程序必须考虑的问题。 网络编程实际上是相当有难度的事,通过使用Java的网络类库,虽然大大简化了网络编程,但网络的随机性错误、时延、并发存取、多平台的固有属性, 使得网络开发要想在可靠性、性能、可扩展性、可移植性方面取得很好的平衡,变得极具挑战性。不管怎样,通过这个简单的聊天系统,我学到了Java网络类的使用、多线程收发模式、简单网聊协议的设计实现及必要的可靠性处理。通过本次实训我学到了很多,在今后的编程路上,我会灵活运用,积累学习更多的编程技巧。 6.参考文献 1 陈敏,Java聊天室系统.论文。 2 深圳职业技术学院精品课程网,http://jpkc.szpt.edu.cn.下载本文