java聊天室项目设计书.doc_第1页
java聊天室项目设计书.doc_第2页
java聊天室项目设计书.doc_第3页
java聊天室项目设计书.doc_第4页
java聊天室项目设计书.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java项目设计 聊天室设计设计人:XXX指导老师:XXX设计时间:2005-4-17到2005-4-24目录第一部分 项目概况 1.项目说明.42.项目背景.4第二部分 项目计划1. 项目目标 42. 项目范围 43. 项目策略 44. 项目开发周期 45. 每项任务所需技能 56. 所采用的工具和技术清单5第三部分 项目设计1 需求分析.52 软件功能.53 概要设计.64 详细设计.6第四部分 项目测试1. 测试阶段2程序界面.73程序运行的条件 4参考的资料第五部分 活动总结第一部分 项目概况1.项目说明项目名称:JAVA聊天室系统。客 户:一般大众。2、项目背景NIIT的课程重在对实际动手能力的培养。通过一段时间JAVA课程的学习,需要对所学的知识作一个综合的运用。由于JAVA强大的网络编程能力,需要写一个简单的聊天室程序的项目,主要能实现在网络上的多线程间的通讯。项目的目的在于巩固前段时间所学的知识以及锻炼小组成员之间团队合作的能力。第二部分 项目计划1. 项目目标(1),允许新用户注册,同时开设帐户。(2),登陆后在用户列表框显示所有的用户姓名。(3),允许用户进行在线的公聊和私聊。(4),把客户端的界面放在Applet上面,在聊天时可以对面版进行一些简单设置。2. 项目范围本软件适用于一般大众。3. 项目策略通过可视化编程的JAVA程序的方式进行实现。 通过增量开发的方法进行此项目的设计与开发。使用套节字进行客户与服务端的通讯。4项目开发周期第一天 需求分析及初步设计阶段(决定每个功能所需的类及数据类型) 第二天 根据相应功能设计出各类所用到的方法及数据类型 第三天第五天 具体实现各个类中的各个方法 第六天 对各个界面和服务器进行调整及测试完善工作 5. 每项任务所需技能服务端与客户端的连接:网络编程中的协议及数据流,异常处理,多线程。程序界面设计:GUI图形用户组件,布局管理,事件监听。代码实现:JAVA与数据库编程。6. 所采用的工具开发工具:Microsoft JAVALE(jdk1.4)+ JCreator LE开发环境:windowsXP+个人电脑第三部分 项目设计1.需求分析随着经济的日益发展,网络的观念深入人心。人们越来越需要通过网络高效简捷的交流,聊天室就是其中的一个工具。2.软件主要功能(1),允许新用户注册,同时开设帐户。(2),登陆后在用户列表框显示所有的用户姓名。(3),允许用户进行在线的公聊和私聊。(4),把客户端的界面放在Applet上面,在聊天时可以对面版进行一些简单设置。程序中要用到的类1、 客户端 2、服务器端3 概要设计聊天室的程序至少需要建立两个程序:一个服务器端,负责监听客户端发送过来的请求,一但监听到客户端的请求,先判断它是登陆信息还是聊天信息,若是登陆信息,那么允许客户端登陆,并把登陆的客户名返回给客户端显示在用户在线列表框内。如果是聊天信息,则把它群发给每个客户端。服务器端不对聊天的信息作公聊和私聊的判断,由客户端收到消息后判断是否是发给自己的信息,以及是否显示在聊天面板上面。客户端的程序需要运用图形化编程做出一个界面。我们小组所做的界面是在聊天室界面的左上方为一个在线用户列表框,列表框的下面有用户登陆的文本域和密码输入框。右边是聊天面板,聊天面板的下面是输入聊天信息的文本域,以及发送和清空按纽。当输入用户名和密码登陆后,在用户列表框内会显示当前在线的所有的用户姓名并且在聊天面板上显示某用户进入了聊天室。然后屏蔽掉登陆和密码输入框。在信息输入框中输入聊天信息后点击发送,在所有客户端的聊天面板上会看到你发送的聊天信息。在用户列表框选择某个用户,勾选私聊复选框然后发送消息,这时只有被你选择的客户端能看到你发送的信息。4 详细设计服务器端代码:/聊天室服务器端程序import java.io.*;import .*;import java.util.*;public class Homework implements RunnableThread thread;static Vector vector;ServerSocket server;public Homework()tryserver=new ServerSocket(8000);System.out.println(服务器已启动);catch(IOException e)vector=new Vector(100);thread=new Thread(this);thread.start();public void run()trywhile(true)Socket socket=server.accept();PThread pt=new PThread(this,socket);pt.setPriority(Thread.MAX_PRIORITY);pt.start();vector.addElement(pt);catch(IOException r)public static void main(String args)new Homework();synchronized public void broadcast(String name)PThread cg;String user;if(name.startsWith(login)for(int i=0;ivector.size();i+)cg=(PThread)vector.elementAt(i);trycg.dout.writeUTF(name+高兴地走进了聊天室.ok!);catch(IOException t) else if(name.startsWith(public) System.out.println(name.substring(6); for(int i=0;ivector.size();i+) cg=(PThread)vector.elementAt(i); try cg.dout.writeUTF(name); catch(IOException a) else if(name.startsWith(private) System.out.println(name.substring(7); for(int i=0;ivector.size();i+) cg=(PThread)vector.elementAt(i); try cg.dout.writeUTF(name); catch(IOException f) /class PThread extends Threadprotected Socket socket;protected Homework home;protected DataInputStream din;protected DataOutputStream dout;String message,message1;PThread cg;public PThread(Homework home,Socket socket)this.socket=socket;this.home=home;trydin=new DataInputStream(socket.getInputStream();dout=new DataOutputStream(socket.getOutputStream();catch(IOException w)public void run()trywhile(true)message1=din.readUTF();if(message1.startsWith(login)message=message1.substring(5,message1.indexOf( )+1);if(true)for(int i=0;ihome.vector.size();i+)cg=(PThread)home.vector.elementAt(i);dout.writeUTF(list+cg.message);home.broadcast(login+message);System.out.println(message+登陆了); if(message1.startsWith(public) message=message1.substring(6,message1.indexOf(); if(true) for(int i=0;ihome.vector.size();i+) cg=(PThread)home.vector.elementAt(i); /dout.writeUTF(public+message); home.broadcast(public+message); if(message1.startsWith(private) message=message1.substring(7,message1.indexOf(); if(true) for(int i=0;ihome.vector.size();i+) cg=(PThread)home.vector.elementAt(i); /dout.writeUTF(private+message); home.broadcast(private+message); catch(IOException e)客户端代码:/聊天室客户端程序import java.awt.*;import java.applet.Applet;import java.applet.AudioClip;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.Date;import .*; public class Homework_client1 extends Applet implements RunnableList UesrNameList; /显示用户名的列表;TextArea Text_Area; /显示用户发言的文本域;JLabel UserName; /显示用户姓名;JLabel UName; /用户姓名面板;JLabel PassWord; /显示登陆口令;TextField PWord; /登陆口令文本框;TextField UN; /用户姓名文本框;JTextField forField; /说文本框;JTextField Sayfield; /发送文本框;JLabel Vslabel; /对面板;JLabel Saylabel; /说面板;JLabel Frontlabel; /前景色面板;JLabel Backlabel; /背景色面板;JLabel Stylelabel; /字体面板;JLabel Wordlabel; /字号面板;JButton Enterbutton; /进入按纽; JButton Quitbutton; /退出按纽;JButton Sendbutton; /发送按纽;JButton Canecelbutton; /刷新按纽; Checkbox Quient; /私聊复选框;Choice C_style; /字体选择框;Choice C_word; /字号选择框;Choice C_front; /前景色选择框;Choice C_back; /背景色选择框;Choice C_music; /音乐选择框;AudioClip Sound; /音乐播放器;JMenuItem Play; /play;JMenuItem Loop; /loop;JMenuItem Stop; /stop; JMenu Start; /播放器菜单;JMenuBar SoundBar; /加载播放菜单; Socket socket; /客户端;Thread Cthread=new Thread(this);DataInputStream din; /数据输入流;DataOutputStream dout; /数据输出流;/*面板的编写*/public void init()/*定义左边的组件(用户名、用户列表、登陆按纽等)*/*将左边组件进行网格包布局,并添加到面板*/Thread Cthread; /创建一个和客户端进行通信的线程;UesrNameList=new List(19);UesrNameList.setBackground(Color.WHITE);UesrNameList.setForeground(new Color(255,0,255);UesrNameList.setFont(new Font(cg,Font.BOLD,14);UserName=new JLabel(用 户 姓 名);UserName.setFont(new Font(cg,Font.ITALIC,14);UName=new JLabel(姓 名);UN=new TextField(11);UN.setFont(new Font(cg,Font.BOLD,13);PassWord=new JLabel(密 码);PWord=new TextField(11);PWord.setEchoChar(*);Enterbutton=new JButton(进入);Enterbutton.setBackground(new Color(136,193,255);Enterbutton.setToolTipText(点此连接服务器);Quitbutton=new JButton(退出);Quitbutton.setToolTipText(点此离开聊天室);Quitbutton.setEnabled(false);Quitbutton.setBackground(new Color(136,193,255);C_music=new Choice(); /初始化音乐控件;C_music.add(遇见.mid);C_music.add(十年.mid);SoundBar=new JMenuBar();SoundBar.setBackground(new Color(136,193,255);Start=new JMenu(音乐);Start.setBackground(new Color(136,193,255);Play=new JMenuItem(播放);Loop=new JMenuItem(循环);Stop=new JMenuItem(停止);Start.add(Play);Start.add(Loop);Start.add(Stop);SoundBar.add(Start);Sound=getAudioClip(getCodeBase(),遇见.mid);JPanel panel_0=new JPanel();panel_0.setBackground(new Color(136,193,255);GridBagLayout gb_0=new GridBagLayout();GridBagConstraints gc_0=new GridBagConstraints();gc_0.fill=GridBagConstraints.NONE;gc_0.weightx=0.0;gc_0.weighty=0.0;gb_0.setConstraints(C_music,gc_0);gb_0.setConstraints(SoundBar,gc_0);panel_0.setLayout(gb_0);panel_0.add(C_music);panel_0.add(SoundBar);JPanel panel_1=new JPanel();panel_1.setBackground(new Color(136,193,255);panel_1.add(UName);panel_1.add(UN);JPanel panel_2=new JPanel();panel_2.setBackground(new Color(136,193,255);panel_2.add(PassWord);panel_2.add(PWord);JPanel panel_3=new JPanel();panel_3.setBackground(new Color(136,193,255);panel_3.add(Enterbutton);panel_3.add(Quitbutton);JPanel NO1panel=new JPanel();NO1panel.setBackground(new Color(136,193,255);GridBagLayout gb_1=new GridBagLayout();GridBagConstraints gc_1=new GridBagConstraints();gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=0;gb_1.setConstraints(panel_0,gc_1);gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=1;gb_1.setConstraints(UserName,gc_1);gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=2;gb_1.setConstraints(UesrNameList,gc_1);gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=3;gb_1.setConstraints(panel_1,gc_1);gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=4;gb_1.setConstraints(panel_2,gc_1);gc_1.anchor=GridBagConstraints.NORTHWEST;gc_1.gridx=0;gc_1.gridy=5;gb_1.setConstraints(panel_3,gc_1);NO1panel.setLayout(gb_1);NO1panel.add(panel_0);NO1panel.add(UserName);NO1panel.add(UesrNameList);NO1panel.add(panel_1);NO1panel.add(panel_2);NO1panel.add(panel_3);/*定义右下方中间的组件*/Quient=new Checkbox(私聊,false);Quient.setBackground(new Color(136,193,255);Quient.setSize(1,1);Vslabel=new JLabel(对);Vslabel.setSize(1,1);forField=new JTextField(7);forField.setEditable(false);Saylabel=new JLabel(说);Saylabel.setSize(1,1);Sayfield=new JTextField(28);Sayfield.setFont(new Font(cg,Font.ROMAN_BASELINE,14);Sayfield.setEditable(false);Sendbutton=new JButton(发送);Sendbutton.setEnabled(false);Sendbutton.setBackground(new Color(136,193,255);/*定义右下方下层组件*/Stylelabel=new JLabel(字体);Stylelabel.setSize(1,1);Wordlabel=new JLabel(表情);Wordlabel.setSize(1,1);Frontlabel=new JLabel(前景色);Frontlabel.setSize(1,1);Backlabel=new JLabel(背景色);Backlabel.setSize(1,1);Canecelbutton=new JButton(刷新);Canecelbutton.setBackground(new Color(136,193,255);C_style=new Choice(); /字体选择框C_style.addItem(BLOD);C_style.addItem(ITALIC);C_style.addItem(PLAIN);C_word=new Choice(); /表情选择框C_word.setSize(2,1);C_word.addItem(无);C_word.addItem(微笑);C_word.addItem(愤怒);C_word.addItem(激动);C_front=new Choice(); /前景色选择框C_front.addItem(RED);C_front.addItem(ORANGE);C_front.addItem(BLUE);C_front.addItem(BLACK);C_back=new Choice(); /背景色选择框C_back.addItem(RED);C_back.addItem(ORANGE);C_back.addItem(BLUE);C_back.addItem(BLACK);/*将右下方组件进行网格包布局,并添加到面板*/JPanel panel_4=new JPanel(); panel_4.setBackground(new Color(136,193,255);GridBagLayout gb_2=new GridBagLayout();GridBagConstraints gc_2=new GridBagConstraints();gc_2.fill=GridBagConstraints.BOTH;gc_2.weightx=1.0;gc_2.weighty=1.0;gb_2.setConstraints(Quient,gc_2);gb_2.setConstraints(Vslabel,gc_2);gc_2.fill=GridBagConstraints.REMAINDER;gc_2.weightx=1.0;gc_2.weighty=1.0;gb_2.setConstraints(forField,gc_2);gb_2.setConstraints(Saylabel,gc_2);gb_2.setConstraints(Sayfield,gc_2);gc_2.fill=GridBagConstraints.RELATIVE;gc_2.weightx=1.0;gc_2.weighty=1.0;gb_2.setConstraints(Sendbutton,gc_2);panel_4.setLayout(gb_2);panel_4.add(Quient);panel_4.add(Vslabel);panel_4.add(forField);panel_4.add(Saylabel);panel_4.add(Sayfield);panel_4.add(Sendbutton);Text_Area=new TextArea(10,10);Text_Area.setEditable(false);Text_Area.setFont(new Font(cg,Font.PLAIN,16);Text_Area.setText(tttt* 欢迎来到聊天室 *);Text_Area.setForeground(new Color(136,193,255);JScrollPane scroll=new JScrollPane(Text_Area);/将AREA添加到滚动面板/*将最右下方组件进行网格包布局,并添加到面板*/JPanel panel_5=new JPanel(); panel_5.setBackground(new Color(136,193,255);GridBagLayout gb_3=new GridBagLayout();GridBagConstraints gc_3=new GridBagConstraints();gc_3.fill=GridBagConstraints.LINE_START;gc_3.weightx=1.0;gc_3.weighty=1.0;gb_3.setConstraints(Stylelabel,gc_3);gc_3.fill=GridBagConstraints.RELATIVE;gc_3.weightx=1.0;gc_3.weighty=1.0;gb_3.setConstraints(C_style,gc_3);gb_3.setConstraints(Wordlabel,gc_3);gb_3.setConstraints(C_word,gc_3);gb_3.setConstraints(Frontlabel,gc_3);gb_3.setConstraints(C_front,gc_3);gb_3.setConstraints(Backlabel,gc_3);gb_3.setConstraints(C_back,gc_3);gc_3.fill=GridBagConstraints.REMAINDER;gb_3.setConstraints(Canecelbutton,gc_3);panel_5.setLayout(gb_3);panel_5.add(Stylelabel);panel_5.add(C_style);panel_5.add(Wordlabel);panel_5.add(C_word);panel_5.add(Frontlabel);panel_5.add(C_front);panel_5.add(Backlabel);panel_5.add(C_back);panel_5.add(Canecelbutton);JPanel panel_6=new JPanel();panel_6.setLayout(new GridLayout(2,1);panel_6.add(panel_4);panel_6.add(panel_5);/*右边组件实现滚动*/JSplitPane sp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,scroll,panel_6);sp.setDividerLocation(400);sp.setDividerSize(10);/*左右组件进行连接并实现滚动*/JSplitPane sp1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,NO1panel,sp);sp1.setEnabled(false);sp1.setDividerLocation(158);sp1.setPreferredSize(this.getSize();sp1.setDividerSize(10);/*加载至Applet*/JPanel panel_7=new JPanel();GridBagLayout gb_4=new GridBagLayout();GridBagConstraints gc_4=new GridBagConstraints();gc_4.fill=GridBagConstraints.BOTH;gc_4.weightx=1.0;gc_4.weighty=1.0;gb_4.setConstraints(sp1,gc_4);panel_7.setLayout(gb_4);panel_7.add(sp1);panel_7.setSize(this.getMaximumSize();panel_7.setBorder(BorderFactory.createTitledBorder(ITEM2 CharRoom);this.setLayout(new BorderLayout();add(panel_7,BorderLayout.CENTER);/*注册事件*/Enterbutton.addActionListener(new Enter();Sendbutton.addActionListener(new Send();Canecelbutton.addActionListener(new Cancel();Quitbutton.addActionListener(new Quit();UesrNameList.addMouseListener(new UNL();C_style.addItemListener(new C_s();C_front.addItemListener(new C_f();C_back.addItemListener(new C_b();C_music.addItemListener(new C_m();Play.addActionListener(new PL();Loop.addActionListener(new LO();Stop.addActionListener(new ST(); /*用户登陆检测、按纽激活以及系统登陆*/ class Enter implements ActionListenerpublic void actionPerformed(ActionEvent e) if(e.getSource().equals(Enterbutton)&(!(UN.getText().equalsIgnoreCase() &(!(PWord.getText().equalsIgnoreCase() Quitbutton.setEnabled(true); Sendbutton.setEnabled(true); Sayfield.setEditable(true); Enterbutton.setEnabled(false); PWord.setEnabled(false); UN.setEnabled(false); try /*和服务器建立连接*/ socket=new Socket(,8000); Text_Area.append(nn网络连接成功! + n); din=new DataInputStream(socket.getInputStream(); dout=new DataOutputStream(socket.getOutputStream(); String message=login+UN.getText()+ ; UesrNameList.add(所有人); dout.writeUTF(message); /向服务器写入用户名; Cthread.start(); catch(IOException q) Text_Area.append(n连接错误); catch(Exception qq) Text_Area.append(n无法连接); else JOptionPane.showConfirmDialog(null,new String(用户名或密码不能为空),错误,JOptionPane.ERROR_MESSAGE); /*事件处理*/ class Send implements ActionListenerpublic void actionPerformed(ActionEvent ee) if(ee.getSource().equals(Sendbutton)&(!(Sayfield.getText().equalsIgnoreCase() if(Quient.getState()=true) if(forField.getText().equalsIgnoreCase(所有人) Text_Area.append(请选择一个具体用户n); else try dout.writeUTF(private+UN.getText()+悄悄的+对.+forField.getText()+C_word.getSelectedItem()+的说+:+Sayfield.getText()+); catch(IOException ss) Sayfield.setText(); else if(Quient.getState()=false) if(!(forField.getText().equalsIgnoreCase() try dout.writeUTF(public+UN.getText()+对+forField.getText()+C_word.getSelectedItem()+的说+:+Sayfield.getText()+); catch(IOException dd) Sayfield.setTex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论