Java项目设计 ————聊天室设计
设计人:XXX 指导老师:XXX
设计时间:2005-4-17到2005-4-24
1
目录
第一部分 项目概况
1.项目说明………………………………………………………………………..4
2.项目背景………………………………………………………………………..4
第二部分 项目计划
1. 项目目标……………………………………………………………… 4
2. 项目范围……………………………………………………………… 4
3. 项目策略……………………………………………………………… 4
4. 项目开发周期………………………………………………………… 4
5. 每项任务所需技能…………………………………………………… 5
6. 所采用的工具和技术清单……………………………………………5
第三部分 项目设计
1 需求分析……………………………………………………………………….5
2 软件功能……………………………………………………………………….5
3 概要设计……………………………………………………………………….6
4 详细设计……………………………………………………………………….6
第四部分 项目测试
1. 测试阶段
2.程序界面.…………………………………………………………………7
3.程序运行的条件
4.参考的资料
第五部分 活动总结
2
第一部分 项目概况
1.项目说明
项目名称:JAVA聊天室系统。
客 户:一般大众。
2、项目背景
NIIT的课程重在对实际动手能力的培养。通过一段时间JAVA课程的学习,需要对所学的知识作一个综合的运用。由于JAVA强大的网络编程能力,需要写一个简单的聊天室程序的项目,主要能实现在网络上的多线程间的通讯。项目的目的在于巩固前段时间所学的知识以及锻炼小组成员之间团队合作的能力。
第二部分 项目计划
1. 项目目标
(1),允许新用户注册,同时开设帐户。
(2),登陆后在用户列表框显示所有的用户姓名。
(3),允许用户进行在线的公聊和私聊。
(4),把客户端的界面放在Applet上面,在聊天时可以对面版进行一些简单设置。
2. 项目范围
本软件适用于一般大众。
3. 项目策略
通过可视化编程的JAVA程序的方式进行实现。
通过增量开发的方法进行此项目的设计与开发。
使用套节字进行客户与服务端的通讯。
4.项目开发周期
3
第一天
需求分析及初步设计阶段(决定每个功能所需的类及数据类型)
第二天
根据相应功能设计出各类所用到的方法及数据类型
第三天~第五天
具体实现各个类中的各个方法
第六天
对各个界面和服务器进行调整及测试完善工作
5. 每项任务所需技能
服务端与客户端的连接:网络编程中的协议及数据流,异常处理,多线程。
程序界面设计:GUI图形用户组件,布局管理,事件监听。
代码实现:JAVA与数据库编程。
6. 所采用的工具
开发工具:Microsoft JAVALE(jdk1.4)+ JCreator LE
开发环境:windowsXP+个人电脑
第三部分 项目设计
1.需求分析
随着经济的日益发展,网络的观念深入人心。人们越来越需要通过网络高效简捷的交流,聊天室就是其中的一个工具。
2.软件主要功能
(1),允许新用户注册,同时开设帐户。
(2),登陆后在用户列表框显示所有的用户姓名。
(3),允许用户进行在线的公聊和私聊。
4
(4),把客户端的界面放在Applet上面,在聊天时可以对面版进行一些简单设置。
程序中要用到的类
1、 客户端
2、服务器端
3 概要设计
聊天室的程序至少需要建立两个程序:
一个服务器端,负责监听客户端发送过来的请求,一但监听到客户端的请求,先判断它是登陆信息还是聊天信息,若是登陆信息,那么允许客户端登陆,并把登陆的客户名返回给客户端显示在用户在线列表框内。如果是聊天信息,则把它群发给每个客户端。服务器端不对聊天的信息作公聊和私聊的判断,由客户端收到消息后判断是否是发给自己的信息,以及是否显示在聊天面板上面。
客户端的程序需要运用图形化编程做出一个界面。我们小组所做的界面是在聊天室界面的左上方为一个在线用户列表框,列表框的下面有用户登陆的文本域和密码输入框。右边是聊天面板,聊天面板的下面是输入聊天信息的文本域,以及发送和清空按纽。当输入用户名和密码登陆后,在用户列表框内会显示当前在线的所有的用户姓名并且在聊天面板上显示某用户进入了聊天室。然后屏蔽掉登陆和密码输入框。在信息输入框中输入聊天信息后点击发送,在所有客户端的聊天面板上会看到你发送的聊天信息。在用户列表框选择某个用户,勾选私聊复选框然后发送消息,这时只有被你选择的客户端能看到你发送的信息。
4 详细设计
服务器端代码:
//聊天室服务器端程序
import java.io.*;
import java.net.*;
import java.util.*;
public class Homework implements Runnable{
Thread thread;
static Vector vector;
ServerSocket server;
5
public Homework(){
try{
server=new ServerSocket(8000);
System.out.println("服务器已启动");
}catch(IOException e){
}
vector=new Vector(100);
thread=new Thread(this);
thread.start();
}
public void run(){
try{
while(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;
6
if(name.startsWith("login"))
{
for(int i=0;i<vector.size();i++)
{
cg=(PThread)vector.elementAt(i);
try{
cg.dout.writeUTF(name+"高兴地走进了聊天室.ok!");
}catch(IOException t){
}
}
}else if(name.startsWith("public"))
{
System.out.println(name.substring(6));
for(int i=0;i<vector.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;i<vector.size();i++){
cg=(PThread)vector.elementAt(i);
try{
cg.dout.writeUTF(name);
7
}catch(IOException f){
}
}
}
}//
}
class PThread extends Thread{
protected 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;
try{
din=new DataInputStream(socket.getInputStream());
dout=new DataOutputStream(socket.getOutputStream());
}catch(IOException w){
}
}
public void run(){
try{
while(true){
message1=din.readUTF();
if(message1.startsWith("login"))
8
{
message=message1.substring(5,message1.indexOf(" ")+1);
if(true){
for(int i=0;i<home.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;i<home.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;i<home.vector.size();i++){
cg=(PThread)home.vector.elementAt(i);
// dout.writeUTF("private"+message);
}
home.broadcast("private"+message);
}
}
}
}catch(IOException e){
9
}
}
}
客户端代码:
//聊天室客户端程序
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 java.net.*;
public class Homework_client1 extends Applet implements Runnable {
List 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; //"私聊"复选框;
10
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));
11
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);
12
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);
13
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");
14
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);
15
Text_Area.setFont(new Font("cg",Font.PLAIN,16));
Text_Area.setText("\t\t\t\t***** 欢迎来到聊天室 *****");
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);
16
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()); 17
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 ActionListener{ public 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("127.0.0.1",8000); Text_Area.append("\n\n网络连接成功!" + "\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连接错误"); 18
}catch(Exception qq){
Text_Area.append("\n无法连接");
}
}else{
JOptionPane.showConfirmDialog(null,new String("用户名或密码不能为空"),"错误",JOptionPane.ERROR_MESSAGE);
}
}
}
/*事件处理*/
class Send implements ActionListener{
public 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){
19
}
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.setText("");
}else{
try{
dout.writeUTF("public"+UN.getText()+"对所有人"+C_word.getSelectedItem()+"的说"+":"+Sayfield.getText()+"]");
}catch(IOException dd){
}
Sayfield.setText("");
}
}
}else{
JOptionPane.showConfirmDialog(null,new String("发言不能为空"),"错误",JOptionPane.ERROR_MESSAGE);
}
}
}
20
class Quit implements ActionListener{
public void actionPerformed(ActionEvent e){
Text_Area.append("\n移除线程待完成\n");
}
}
class Cancel implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource().equals(Canecelbutton)){
Text_Area.setText("");
Text_Area.setText("\t\t\t\t***** 欢迎来到聊天室 *****"); }
}
}
class UNL extends MouseAdapter{
public void mouseClicked(MouseEvent e){
if(e.getSource().equals(UesrNameList)){
String UserNList=UesrNameList.getSelectedItem(); forField.setText(UserNList);
}
}
}
class C_s implements ItemListener{
public void itemStateChanged(ItemEvent e){
if(C_style.getSelectedItem().equalsIgnoreCase("BLOD"))
{
Sayfield.setFont(new Font("cg",Font.BOLD,16)); Text_Area.setFont(new Font("cg",Font.BOLD,16));
21
}else if(C_style.getSelectedItem().equalsIgnoreCase("ITALIC"))
{
Sayfield.setFont(new Font("cg",Font.ITALIC,16));
Text_Area.setFont(new Font("cg",Font.ITALIC,16));
}else{
Sayfield.setFont(new Font("cg",Font.PLAIN,16));
Text_Area.setFont(new Font("cg",Font.PLAIN,16));
}
}
}
class C_f implements ItemListener{
public void itemStateChanged(ItemEvent e){
if(C_front.getSelectedItem().equalsIgnoreCase("RED")) {
Sayfield.setForeground(Color.RED);
Text_Area.setForeground(Color.RED);
}else if(C_front.getSelectedItem().equalsIgnoreCase("BLUE")) {
Sayfield.setForeground(Color.BLUE);
Text_Area.setForeground(Color.BLUE);
}else if(C_front.getSelectedItem().equalsIgnoreCase("ORANGE")) {
Sayfield.setForeground(Color.orange);
Text_Area.setForeground(Color.orange);
}else{
Sayfield.setForeground(Color.BLACK);
Text_Area.setForeground(Color.BLACK);
}
22
}
}
class C_b implements ItemListener{
public void itemStateChanged(ItemEvent e){
if(C_back.getSelectedItem().equalsIgnoreCase("RED")) {
Text_Area.setBackground(Color.RED);
}else if(C_back.getSelectedItem().equalsIgnoreCase("ORANGE")) {
Text_Area.setBackground(Color.orange);
}else if(C_back.getSelectedItem().equalsIgnoreCase("BLUE")) {
Text_Area.setBackground(Color.BLUE);
}else{
Text_Area.setBackground(Color.BLACK);
}
}
}
class C_m implements ItemListener{
public void itemStateChanged(ItemEvent e){
Sound.stop();
Sound=getAudioClip(getCodeBase(),C_music.getSelectedItem());
}
}
class PL implements ActionListener{
public void actionPerformed(ActionEvent e){
23
if(e.getSource().equals(Play)){
Sound.play();
}
}
}
class LO implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource().equals(Loop)){
Sound.loop();
}
}
}
class ST implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource().equals(Stop)){
Sound.stop();
}
}
}
public void run(){
String ms;
try{
while(true){
ms=din.readUTF();
if(ms.startsWith("list")){
UesrNameList.add(ms.substring(4)); }
24
if(ms.startsWith("login")){
if((ms.substring(ms.indexOf(".")+1)).equals("ok!")) {
UesrNameList.add(ms.substring(5,ms.indexOf(" "))); }
Text_Area.append(ms.substring(5)+"\n");
Sayfield.setText("");
}
if(ms.startsWith("public")){
Text_Area.append(ms.substring(6)+"\n");
Sayfield.setText("");
}
if(ms.startsWith("private")){
String mm=ms.substring(ms.indexOf(".")+1);
if(mm.startsWith(UN.getText()))
{
Text_Area.append(ms.substring(7)+"\n");
}
// Text_Area.append("你悄悄的"+forField.getText()+C_word.getSelectedItem()+"的说:"+Sayfield.getText()+"\n"); Sayfield.setText("");
}
}
}catch(IOException w){
}
}
}
第四部分 项目测试
1. 测试阶段
对25
程序的编写过程中我们小组成员边编写边调试,在实现主要功能的基础上对程序进行不断的改进以及界面的美化。
2.程序界面.
服务器端没有图形用户界面,客户端是一个网页形式的图形界面,界面的布局和功能在慨要设计里已经阐述。
3.程序运行的条件
在JCreator LE软件中运行服务器端,客户端直接双击打开html文件。
第五部分 活动总结
通过这次的NIIT的课程设计,使我们小组的成员对使用 JAVA编程有了更深一步的认识,特别是如何运用网络编程,多线程的知识实现多线程间的通讯,以及事件处理和图形用户界面相结合,还有流的用法以及异常捕获的用法。总体来说,对所学知识的综合运用是一个比较大的提高。也使我们对把书本上所的知识如何运用到实践当中去有了许多体会。 在课程设计中由于时间的紧我们个人水平的限制,在程序设计中还存在某些功能未能实现或者未能完全实现,还有一些难以排除的BUG,这使我们感受到我们所学知识的不足,在往后的学习中应该更加刻苦和认真。不断的积累写程序的经验,以在一年多的学习中能够使自己有一个大的提高。
26