JAVA聊天室实训报告.docx
《JAVA聊天室实训报告.docx》由会员分享,可在线阅读,更多相关《JAVA聊天室实训报告.docx(30页珍藏版)》请在冰豆网上搜索。
JAVA聊天室实训报告
江西农业大学
聊天室程序设计报告
题目:
聊天室程序设计
院系名称:
软件学院
专业名称:
软件工程嵌入式方向
班级:
099班
学生姓名:
余连俊
学号(8位):
20091962
指导教师:
何火娇
一.设计目的
在当今信息时代,越来越多的聊天工具被应用,java语言是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。
使用java语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。
面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。
此次设计的题目为聊天室,可以巩固所学的java语言基础知识,增进java语言的编辑基本功,拓宽常用类库的应用,使我们通过教学环节与手段,把所学的课程及相关知识加以融会贯通,全面掌握java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
二.设计内容
运用java程序编写聊天室,实现简单的聊天功能。
它是图形界面,线程,流与文件系统等技术的综合应用。
其界面主要采用了java.awt包,java.swing包等。
程序实现了聊天室的基本功能,其中有:
1.启动服务器。
2.启动登陆界面。
3.进入客户端界面。
4.发送信息。
5.离开客户端界面。
6.关闭服务器。
三.概要设计
1.首先通过继承JFrame类构造服务器界面。
使服务器能够为每一个客户启动一个线程,记录客户的上下线行为、登陆的ip,放送消息的时刻,监视客户的聊天记录,对于出现不文明的话语,在客户端进行屏蔽,并统计出现不文明话语的次数,超过三次提示警告信息,并将其踢出聊天室。
2.设计客户端程序使其能够完成正常的通信功能,并且可以更改背景颜色,设置字体颜色。
3.设计登录程序,使其显示登录的ip地址端口号,以及用户昵称,通过登录按钮可以调用客户端程序,实现聊天功能。
1.功能模块图;
2.各个模块详细的功能描述。
1,服务器端功能描述:
记录用户的上下线,显示系统时间,显示在线用户的用户名和ip地址,监听客户的聊天记录,刷新列表,启动服务,对于重复启动,显示警告信息,屏蔽用户的不文明言语,对于多次使用不文明用语的用户将其踢出聊天室,并向客户端放送相应信息。
向个客户端广播系统消息。
2.登录界面
显示登录的端口号,ip地址,昵称,通过按动登录按钮进入客户端界面,或取消登录操作。
3.客户端功能描述;显示登录昵称,显示聊天记录,更改背景颜色,设置字体颜色,放送信息,关闭聊天窗口。
四.详细设计
程序中引入的包:
import.*;
importjava.io.*;
importjava.util.*;
importjava.awt.event.*;
importjava.awt.*;
importjavax.swing.*;
服务器端代码中用户自定义的类:
类名;server
作用:
服务器的启动
继承的类:
JFrame,构造服务器界面。
定义的对象:
TextArea文本域
java.awt.List在线客户列表
ServerSocket服务器
Socket客户端
主要的成员方法:
voidinit()构造服务器端的界面
publicvoidactionPerformed(ActionEvente)按钮监听器
publicvoidkeyPressed(KeyEvente)键盘监听器
类名:
start
作用:
启动服务器的线程
继承的类名:
thread
主要的成员方法:
publicvoidrun()启动服务器的线程
类名;SgService
继承的类名:
thread
主要的成员方法:
publicvoidrun()处理单个客户的线程
(2)用户登录相关的类:
类名:
login
作用:
构造登录界面
继承的类:
JFrame
实现的接口:
ActionListener
构造方法;publicLogin()
主要的成员方法:
publicvoidactionPerformed(ActionEvente)实现"登录"和"取消"按钮的监听器
类名:
LoginStart
继承的类:
Thread
主要的方法;publicvoidrun()
作用:
如果登录成功,则弹出客户端聊天窗口,如果登录失败,则打印出"登录失
败",以告知客户
(3)客户端相关的类
类名:
Client
继承的类:
JFrame
构造方法;publicClient(PrintStreamout,BufferedReaderin,Stringname)
主要的成员方法:
publicvoidreceive()接受服务端发来的信息
1.功能函数的调用关系图
2.各功能函数的数据流程图
互相通信
3.重点设计及编码
//聊天室服务器
import.*;
importjava.io.*;
importjava.util.*;
importjava.awt.event.*;
importjava.awt.*;
importjavax.swing.*;
classServerextendsJFrame{
privateTextAreamsgA=newTextArea();//服务器用来输入的文本域
privateTextAreaarea=newTextArea();//服务器显示消息的文本域
privateTextFieldportT=newTextField("8888");
privatejava.awt.Listlist=newjava.awt.List();//在线客户列表
privateServerSocketserver;//服务器
privateSocketclient;//客户端
privateMapcontainer=newHashMap();//HashMap
voidinit(){
//设置几个面板//
Panelp1=newPanel();
Panelp2=newPanel();
Panelp3=newPanel();
Panelp4=newPanel();
Panelp5=newPanel();
Panelp6=newPanel();
Panelp7=newPanel();
Panelp8=newPanel();
Panelp9=newPanel();
Panelp10=newPanel();
//设置两个主要的文本框
Labellb1=newLabel("服务器界面");
lb1.setBackground(newColor(250,120,150));
Labellb2=newLabel("port");
BorderLayoutborder1=newBorderLayout();
p1.setLayout(border1);
p1.add(BorderLayout.CENTER,area);
BorderLayoutborder2=newBorderLayout();
p5.setLayout(border2);
p5.add(BorderLayout.NORTH,p3);
p5.add(BorderLayout.CENTER,msgA);
BorderLayoutborder3=newBorderLayout();
p7.setLayout(border3);
p7.add(BorderLayout.CENTER,p1);
p7.add(BorderLayout.SOUTH,p5);
p7.setBackground(newColor(250,150,200));
JButtonstartButton=newJButton("启动服务");
JButtonsendButton=newJButton("发送");
JButtonflushButton=newJButton("刷新列表");
FlowLayoutfl=newFlowLayout(FlowLayout.LEFT);
p8.setLayout(fl);
p8.add(lb2);
p8.add(portT);
p8.add(startButton);
p8.add(sendButton);
p8.add(flushButton);
p8.setBackground(newColor(250,120,150));
BorderLayoutborder4=newBorderLayout();
p9.setLayout(border4);
p9.add(BorderLayout.CENTER,p7);
p9.add(BorderLayout.SOUTH,p8);
p10.setLayout(newBorderLayout());
Labellb3=newLabel("在线用户");
lb3.setBackground(newColor(250,120,150));
p10.add(lb3,BorderLayout.NORTH);
p10.add(list,BorderLayout.CENTER);
area.setEditable(false);
BorderLayoutborder=newBorderLayout();
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventarg0){
System.exit(0);
}
});
this.setLayout(border);
this.add(BorderLayout.NORTH,lb1);
this.add(BorderLayout.CENTER,p9);
this.add(BorderLayout.EAST,p10);
this.setTitle("聊天服务器");
this.setBounds(100,100,600,550);
this.setVisible(true);
//"启动服务"按钮监听器
startButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Threadt=newStart();
t.start();
}
});//启动按钮监听器----end
//发送按钮监听器
sendButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringmsg=msgA.getText();
if(msg!
=null&&msg!
=""){//如果消息不为空
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
broadcast(time+"[系统消息]:
"+msg);//那么广播这条系统消息
area.append(time+"[系统消息]:
"+msg+"\n");
msgA.setText("");
}
}
});//end
//刷新按钮监听器
flushButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(list!
=null){
list.removeAll();//清空在线用户列表,以便刷新
}
Set>mySet=container.entrySet();
for(Iterator>it=mySet.iterator();it.hasNext();){//刷新列表
Map.Entryme=it.next();
StringaClientName=me.getKey();
SocketaClient=me.getValue();
StringaClientAddress=aClient.getInetAddress().getHostAddress();
list.add(aClientName+"----"+aClientAddress);
}//endoffor
}//endofactionPerformed
});//end
msgA.addKeyListener(newKeyAdapter(){//键盘监听器---按下Enter发送信息
publicvoidkeyPressed(KeyEvente){
intvalue=e.getKeyCode();
if(value==KeyEvent.VK_ENTER){
Stringmsg=msgA.getText();
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
broadcast(time+"[系统消息]:
"+msg);//那么广播这条系统消息
area.append(time+"[系统消息]:
"+msg+"\n");
msgA.setText("");
}
}
});
}//endofinit()
classStartextendsThread//启动服务器的线程
{
publicvoidrun(){
try{
if(server!
=null&&!
server.isClosed()){
area.append("警告!
服务器已在启动中!
\n");
}
else{
server=newServerSocket(Integer.parseInt(portT.getText()));//启动服务器
area.append((newDate()).toString()+'\n'+"[恭喜!
^_^]"+"服务器启动成功!
"+"\n\n");
}
while(true){
client=server.accept();
ThreadsgS=newSgService(client);//为每位登录的客户创建一个线程
sgS.start();//启动客户线程
}
}
catch(Exceptione){
System.out.println("cuowu1");
e.printStackTrace();
}
}//endofrun()
}//endofStart
//处理单个客户的线程
classSgServiceextendsThread//SgService---begin
{
privateSocketclient=null;//客户套接字
privateBufferedReaderbr=null;//输入流
privatePrintStreamps=null;
privateintcounter=0;//记录是第几次接受用户的信息
privateintmark=0;//记录用户说不文明用语的次数
privateStringname=null;
SgService(Socketclient){//构造方法
this.client=client;
publicvoidrun(){//run()----begin
try{
br=newBufferedReader(newInputStreamReader(client.getInputStream()));
ps=newPrintStream(client.getOutputStream());
Stringmsg=null;
while((msg=br.readLine())!
=null){//无限循环,意味着可以和客户进行无限次交互
if(counter==0){
name=msg;
container.put(name,client);
list.add(name+"----"+client.getInetAddress().getHostAddress());
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=hh+":
"+mm+":
"+ss+"";
broadcast(time+name+"上线了!
");
area.append(time+name+"上线了!
\n\n");
counter++;
}
else{
if(msg.equals("你是个笨蛋")){
mark=mark+1;
if(mark<3){
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
singleCom(time+"[系统消息]:
警告!
请注意文明用语!
",client);
//在服务器端显示这个用户说不文明语言的次数
area.append(time+"[系统消息]:
"+name+"第"+mark+"次使用了不文明用语,特此警告!
");
}
else{//如果客户第三次说不文明的话,系统就把他踢出聊天室
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
if(mark==3){
singleCom(time+"[系统消息]:
由于您多次使用了不文明用语,经警告无效,现已被踢出聊天室!
",client);//告诉他本人
}
removeClient(name,client);//从系统列表中删除这个人的信息
//并向所有人广播这一消息
broadcast(time+"[系统消息]:
"+name+"由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!
");
area.append(time+"[系统消息]:
"+name+"由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!
\n");
}
}
else{
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
area.append(time+name+"说:
"+msg+"\n\n");//将客户发送的消息显示在服务器的窗口中
broadcast(time+name+"说:
"+msg+"\n");//同时向每个在线客户广播这则消息
}
}
}//endofwhile
}
catch(Exceptionex){
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+":
"+mm+":
"+ss+"");
area.append(time+name+"下线了!
\n");
broadcast(time+name+"下线了!
\n");
list.remove(name+"----"+client.getInetAddress().getHostAddress());
contain