面向对象程序设计课程设计客户端服务器聊天室.docx
- 文档编号:24466766
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:29
- 大小:241.32KB
面向对象程序设计课程设计客户端服务器聊天室.docx
《面向对象程序设计课程设计客户端服务器聊天室.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计课程设计客户端服务器聊天室.docx(29页珍藏版)》请在冰豆网上搜索。
面向对象程序设计课程设计客户端服务器聊天室
《面向对象程序设计课程设计》
报告
姓名:
学号:
学院:
专业:
班级:
目录
1.功能分析----------------------------------------
1.1.服务端程序需要完成的一些基本功能---------------------
1.2.客户端程序需要完成的一些基本功能---------------------
2.系统设计----------------------------------------
2.1.聊天室服务器端模块主要有以下几部分组成------
2.1.1.主框架类(ServerChat.java)--------------
2.1.2.服务器用户上线侦听类----------------------------
2.1.3.服务器的启动和发送类----------------------------
2.1.4.服务器的接收类----------------------------------
2.2.聊天室客户端模块主要有以下几部分组成---------
2.2.1.主框架类(ClientChat.java)--------------
2.2.2.客户端发送消息类-----------------------------
2.2.3.客户端接收消息类---------------------------------
2.3服务器端程序和客户端程序的编写过程
2.3.1.流程设计---------------------------------
2.3.2.服务器程序编写----------------------------------
2.3.3.客户端程序编写----------------------------------
3系统实现-------------------------------------
3.1.ServerChat.java--------------------------------
3.2.ClientChat.java--------------------------------
4.课程总结---------------------------------------
1.功能分析。
(进行问题的描述及确定程序将要实现的具体功能,用文字描述即可)
该课程设计为C/S结构模式的聊天室,分为两个部分,一个是客户端程序,一个是服务端程序,需要先开启服务器,再开启客户端才能使用。
1.1.服务端程序需要完成的一些基本功能。
(1)启动服务器。
(2)停止服务器。
(3)退出服务器。
(4)接受客户端发送过来的消息,把消息显示在服务器的文本区上。
(5)可以向客户端程序发送消息。
(6)可以增加其他功能,比如显示上线时间,背景颜色等。
1.2.客户端程序需要完成的一些基本功能。
(1)启动客户端,登录服务器。
(2)退出客户端。
(3)向服务器发送消息。
(4)接受服务器发来的消息。
(5)更换背景颜色,显示上线时间。
(6)还可以增加其他的功能,比如向某个客户端发送消息进行私聊等。
2.系统设计。
(制定程序功能实现的具体设计思路及主要类说明,并检查流程设计。
类说明用表格描述即可)
该聊天室功能实现的具体设计思路:
聊天室分为两个部分,服务器端和客户端部分。
服务器端的功能设计是先运行服务器,再启动服务器等待客户端的连接,当连接成功后通知客户端可以进行聊天。
在聊天的时候可以更换背景色,可以统计在线人数。
还有停止服务器和退出服务器功能。
当开启服务器的停止功能后,客户端就不能进行交互。
服务器端还可以增加其他的功能,比如统计客户在线人数,实现客户端之间的私聊功能等。
客户端的功能设计是先运行客户端,然后登录连接服务器,当连接成功后便可以进行聊天功能。
客户端还可以增加其他的功能,比如,需要客户先进行注册,注册成功后再登录连接服务器才能进行聊天功能等。
2.1.聊天室服务器端模块主要有以下几部分组成
2.1.1.主框架类
该文件包含名为ServerChat的public类,其主要功能是定义服务器的界面。
添加事件侦听,事件处理。
利用套接字ServerSocket和socket的对象进行消息的收发。
2.1.2.服务器用户上线侦听类.
该类实现了Runnable类,重写了Runnable类中的run方法,在run方法中实现对服务器用户的上线侦听。
2.1.3.服务器的启动和发送类。
该类实现了ActionListener类,重写了ActionListener类的actionPerformed方法。
在actionPerformed方法中实现对服务器的启动。
实现对服务器消息的发送工作。
2.1.4.服务器的接收类。
该类实现了Runnable类,重写了Runnable类中的run方法,在run方法中实现对服务器用户消息的接收工作。
2.2.聊天室客户端模块主要有以下几部分组成
2.2.1.主框架类(ClientChat.java)
该文件包含名为ClientChat的public类,其主要功能是定义客户端的界面。
添加事件侦听,事件处理。
2.2.2.客户端发送消息类。
该类实现了ActionListener类,重写了ActionListener类的actionPerformed方法。
在actionPerformed方法中实现对客户端的启动和登录服务器及向服务器发送消息的工作。
如果增加了多个客户端,还可以和其他客户端进行交互等。
2.2.3客户端接收消息类。
该类实现了Runnable类,调用了Runnable类中的run方法来实现对服务器发过来的消息进行接收工作。
如果还增加了其他的客户端,那么也可以和其他的客户端进行交互,实现私聊功能。
2.2.4主要类说明
类、接口
功能
JFrame
JFrame类的实例就是一个底层容器,即通常所说的窗口。
在该程序中是ClientChat类的父类。
ClientChat
其主要功能是定义服务器的界面。
添加事件侦听,事件处理。
ActionListener
ActionListener接口中只有一个actionPerformed()方法。
当发生ActionEvent事件时,监视器调用接口中的actionPerformed(ActionEvente)方法对发生的事件作出处理
Runnable
声明一个实现Runnable接口的类并实现run()方法。
在调用start()方法时,将创建一个新的控制线程,接着它将调用run()方法。
run()方法中的代码定义执行线程所需的功能
Socket
在套接字通信中客户端的程序使用Socket类建立与服务器套接字连接
ServerSocket
服务器端程序使用ServerSocket类建立接收客户套接字的服务器套接字
2.3服务器端程序和客户端程序的编写过程
2.3.1.流程设计
等待客户端的连接连接服务器
服务器已断开,请重新连接
2.3.2.服务器程序编写
(1)调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上;
(2)调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
(3)调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
(4)最后关闭通信套接字。
2.3.3.客户端程序编写
(1)调用Socket()创建一个流套接字,并连接到服务器端;
(2)调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
(3)最后关闭通信套接字。
3.系统实现。
(附上具体源代码)
服务器:
3.1.ServerChat.java
packagecn.wxx;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
import.*;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.io.*;
publicclassServerChatextendsJFrameimplementsActionListener,Runnable
{
privateintport=8888;
privateServerSocketserver;
privateSocketclient;
privateBufferedReadercin;
privatePrintWritercout;
privateThreadchatThread;
privateJPanelp1;
privateJButtonstartButton;
privateJButtonstopButton;
privateJButtonexitButton;
privateJScrollPanescrollPanel;
privateJTextAreamessage;
privateJPanelp2;
privateJTextFieldserverMessage;
privateJButtonmessageButton;
publicServerChat()
{
super("网络聊天服务器");
p1=newJPanel();
startButton=newJButton("启动");
stopButton=newJButton("停止");
exitButton=newJButton("退出");
startButton.addActionListener(this);
stopButton.addActionListener(this);
exitButton.addActionListener(this);
p1.add(startButton);
p1.add(stopButton);
p1.add(exitButton);
add(p1,BorderLayout.NORTH);
p1.setBackground(Color.blue);
message=newJTextArea();
scrollPanel=newJScrollPane(message,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(scrollPanel,BorderLayout.CENTER);
p2=newJPanel();
serverMessage=newJTextField(15);
messageButton=newJButton("发送消息");
messageButton.addActionListener(this);
p2.add(serverMessage);
p2.add(messageButton);
add(p2,BorderLayout.SOUTH);
p2.setBackground(Color.blue);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,400);
setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==startButton)
{
try
{
server=newServerSocket(port);
}
catch(Exceptionexp)
{
}
chatThread=newThread(this);
chatThread.start();
startButton.setVisible(false);
message.append(getTime()+"\n"+"服务器已经启动"+"\n");
}
elseif(e.getSource()==stopButton)
{
chatThread=null;
startButton.setVisible(true);
if(cout!
=null)
{
cout.println("stop");
}
try
{
if(server!
=null)
{
server.close();
}
}
catch(Exceptionexp)
{
}
}
elseif(e.getSource()==exitButton)
{
chatThread=null;
if(cout!
=null)
{
cout.println("exit");
}
System.exit(0);
}
elseif(e.getSource()==messageButton)
{
if(chatThread!
=null)
{
cout.println(serverMessage.getText());
message.append("服务器发送了:
"+serverMessage.getText()+"\n");
}
}
}
publicvoidrun()
{
while(true)
{
try
{
client=server.accept();
ServerChatThreadsct=newServerChatThread(client);
Threadt=newThread(sct);
t.start();
}
catch(Exceptionexp)
{
}
}
}
publicstaticvoidmain(String[]args)
{
ServerChatserverChat=newServerChat();
}
privateStringgetTime()
{
Datedate=newDate();
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
returnsdf.format(date);
}
classServerChatThreadimplementsRunnable
{
privateSocketclient2;
ServerChatThread(Socketclient)
{
client2=client;
}
publicvoidrun()
{
while(true)
{
try
{
cin=newBufferedReader(newInputStreamReader(client2.getInputStream()));
cout=newPrintWriter(client2.getOutputStream(),true);
Stringusername=cin.readLine();
if(username!
=null)
{
message.append("客户:
"+username+"进入"+"\n");
cout.println("ok");
}
Stringaline="";
while(chatThread!
=null)
{
aline=cin.readLine();
if(aline.equals("exit"))
{
break;
}
else
{
message.append(username+"说:
"+aline+"\n");
}
}
}
catch(Exceptionexp)
{
}
}
}
}
}
客户端:
3.2.ClientChat.java
packagecn.wxx;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
import.*;
importjava.util.Date;
importjava.text.SimpleDateFormat;
importjava.io.*;
publicclassClientChatextendsJFrameimplementsActionListener,Runnable
{
privateintport=8888;
privateSocketclient;
privateBufferedReadercin;
privatePrintWritercout;
privateThreadchatThread;
privateJPanelp1;
privateJLabelusernameLabel;
privateJTextFieldusername;
privateJButtonloginButton;
privateJButtonexitButton;
privateJScrollPanescrollPanel;
privateJTextAreamessage;
privateJPanelp2;
privateJTextFieldclientMessage;
privateJButtonclientButton;
publicClientChat()
{
super("网络聊天客户端");
p1=newJPanel();
usernameLabel=newJLabel("用户名");
username=newJTextField(10);
loginButton=newJButton("登录");
exitButton=newJButton("退出");
loginButton.addActionListener(this);
exitButton.addActionListener(this);
p1.add(usernameLabel);
p1.add(username);
p1.add(loginButton);
p1.add(exitButton);
add(p1,BorderLayout.NORTH);
p1.setBackground(Color.blue);
message=newJTextArea();
scrollPanel=newJScrollPane(message,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(scrollPanel,BorderLayout.CENTER);
message=newJTextArea();
scrollPanel=newJScrollPane(message,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(scrollPanel,BorderLayout.CENTER);
p2=newJPanel();
clientMessage=newJTextField(15);
clientButton=newJButton("发送消息");
clientButton.addActionListener(this);
p2.add(clientMessage);
p2.add(clientButton);
add(p2,BorderLayout.SOUTH);
p2.setBackground(Color.blue);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,400);
setVisible(true);
}
privateStringgetTime()
{
Datedate=newDate();
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
returnsdf.format(date);
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==loginButton)
{
if(loginServer(username.getText()))
{
chatThread=newThread(this);
chatThread.start();
}
}
elseif(e.getSource()==exitButton)
{
chatThread=null;
if(cout!
=null)
{
cout.println("exit");
}
System.exit(0);
}
elseif(e.getSource()==clientButton)
{
if(chatThread!
=null)
{
cout.println(clientMessage.getText());
message.append(username.getText()+"发送了"+clientMessage.getText()+"\n");
}
}
}
publicbooleanloginServer(Stringusername)
{
try
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 课程设计 客户端 服务器 聊天室