JAVA聊天室.docx
《JAVA聊天室.docx》由会员分享,可在线阅读,更多相关《JAVA聊天室.docx(74页珍藏版)》请在冰豆网上搜索。
JAVA聊天室
JAVA聊天室
基于JAVA的聊天室设计与实现
一、设计目的:
信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。
“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。
这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。
人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。
它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生巨大影响。
聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。
在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。
此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。
二、需求分析
人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。
一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。
所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。
根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:
(1)、聊天功能:
可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。
(2)、用户功能:
可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。
(3)、文件传输功能:
用户可以共享资源,能发送及接收文件。
(4)、保密功能:
用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。
(5)、系统稳定:
客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。
该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、注销、查看在线用户等。
用户设置:
用户可以设置自己的用户名进行聊天;
连接设置:
用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:
127.0.0.1:
8888;
用户登录:
只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;
用户注销:
退出聊天,可以继续修改用户设置和连接设置;
发送和接收聊天信息:
用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;
退出:
关闭所有聊天并退出客户端。
1、流程图
设置侦听端口
默认端口:
8888
设置用户名
默认连接地址或用户名
设置IP地址和端口
五.主要类UML关系图:
聊天室服务器端设计:
1、聊天室服务器端设计:
聊天室服务端主要包括7个文件,它们的功能如下:
(1)ChatServer.java:
包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。
调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。
(2)ServerListen.java:
该类实现服务端用户上线与下线的侦听。
该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。
(3)ServerReceive.java:
该类是实现服务器端的消息的收发的类。
该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。
(4)PortConf.java:
该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类。
(5)Node.java:
用户链表的节点类,定义了链表中的用户。
该类与前面所讲的链表节点Node类的功能相当。
(6)UserLinkList.java:
用户链表节点的具体实现类。
该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。
(7)Help.java:
服务端程序的帮助类。
聊天室客户端设计:
聊天室客户端主要包括5个文件,它们的功能如下:
(1)ChatClient.java:
包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。
该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。
当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。
(2)ClientReceive.java:
该类是实现服务器端与客户端消息收发的类。
(3)ConnectConf.java:
该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。
(4)UserConf.java:
该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。
(5)Help.java:
客户端程序的帮助类。
六.主要程序代码清单和注释说明:
******************ChatServer.java****************************************
publicvoidactionPerformed(ActionEvente){
Objectobj=e.getSource();
if(obj==startServer||obj==startItem){//启动服务端
startService();
}
elseif(obj==stopServer||obj==stopItem){//停止服务端
intj=JOptionPane.showConfirmDialog(
this,"真的停止服务吗?
","停止服务",
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j==JOptionPane.YES_OPTION){
stopService();
}
}
elseif(obj==portSet||obj==portItem){//端口设置
//调出端口设置的对话框
PortConfportConf=newPortConf(this);
portConf.show();
}
elseif(obj==exitButton||obj==exitItem){//退出程序
intj=JOptionPane.showConfirmDialog(
this,"真的要退出吗?
","退出",
JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
if(j==JOptionPane.YES_OPTION){
stopService();
System.exit(0);
}
}
elseif(obj==helpItem){//菜单栏中的帮助
//调出帮助对话框
HelphelpDialog=newHelp(this);
helpDialog.show();
}
elseif(obj==sysMessage||obj==sysMessageButton){//发送系统消息
sendSystemMessage();
}
}
/**
*启动服务端
*/
publicvoidstartService(){
try{
serverSocket=newServerSocket(port,10);
messageShow.append("服务端已经启动,在"+port+"端口侦听...\n");
startServer.setEnabled(false);
startItem.setEnabled(false);
portSet.setEnabled(false);
portItem.setEnabled(false);
stopServer.setEnabled(true);
stopItem.setEnabled(true);
sysMessage.setEnabled(true);
}
catch(Exceptione){
//System.out.println(e);
}
userLinkList=newUserLinkList();
listenThread=newServerListen(serverSocket,combobox,
messageShow,showStatus,userLinkList);
listenThread.start();
}
/**
*关闭服务端
*/
publicvoidstopService(){
try{
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop=true;
serverSocket.close();
intcount=userLinkList.getCount();
inti=0;
while(iNodenode=userLinkList.findUser(i);
node.input.close();
node.output.close();
node.socket.close();
i++;
}
stopServer.setEnabled(false);
stopItem.setEnabled(false);
startServer.setEnabled(true);
startItem.setEnabled(true);
portSet.setEnabled(true);
portItem.setEnabled(true);
sysMessage.setEnabled(false);
messageShow.append("服务端已经关闭\n");
combobox.removeAllItems();
combobox.addItem("所有人");
}
catch(Exceptione){
//System.out.println(e);
}
}
/**
*向所有人发送服务器关闭的消息
*/
publicvoidsendStopToAll(){
intcount=userLinkList.getCount();
inti=0;
while(iNodenode=userLinkList.findUser(i);
if(node==null){
i++;
continue;
}
try{
node.output.writeObject("服务关闭");
node.output.flush();
}
catch(Exceptione){
//System.out.println("$$$"+e);
}
i++;
}
}
/**
*向所有人发送消息
*/
publicvoidsendMsgToAll(Stringmsg){
intcount=userLinkList.getCount();//用户总数
inti=0;
while(iNodenode=userLinkList.findUser(i);
if(node==null){
i++;
continue;
}
try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
catch(Exceptione){
//System.out.println("@@@"+e);
}
i++;
}
sysMessage.setText("");
}
/**
*向客户端用户发送消息
*/
publicvoidsendSystemMessage(){
StringtoSomebody=combobox.getSelectedItem().toString();
Stringmessage=sysMessage.getText()+"\n";
messageShow.append(message);
//向所有人发送消息
if(toSomebody.equalsIgnoreCase("所有人")){
sendMsgToAll(message);
}
else{
//向某个用户发送消息
Nodenode=userLinkList.findUser(toSomebody);
try{
node.output.writeObject("系统信息");
node.output.flush();
node.output.writeObject(message);
node.output.flush();
}
catch(Exceptione){
//System.out.println("!
!
!
"+e);
}
sysMessage.setText("");//将发送消息栏的消息清空
}
}
publicstaticvoidmain(String[]args){
ChatServerapp=newChatServer();
}
}
************************ServerListen.java:
***************************
publicclassServerListenextendsThread{
ServerSocketserver;
JComboBoxcombobox;
JTextAreatextarea;
JTextFieldtextfield;
UserLinkListuserLinkList;//用户链表
Nodeclient;
ServerReceiverecvThread;
publicbooleanisStop;
/*
*聊天服务端的用户上线于下线侦听类
*/
publicServerListen(ServerSocketserver,JComboBoxcombobox,
JTextAreatextarea,JTextFieldtextfield,UserLinkListuserLinkList){
this.server=server;
bobox=combobox;
this.textarea=textarea;
this.textfield=textfield;
this.userLinkList=userLinkList;
isStop=false;
}
publicvoidrun(){
while(!
isStop&&!
server.isClosed()){
try{
client=newNode();
client.socket=server.accept();
client.output=newObjectOutputStream(client.socket.getOutputStream());
client.output.flush();
client.input=newObjectInputStream(client.socket.getInputStream());
client.username=(String)client.input.readObject();
//显示提示信息
combobox.addItem(client.username);
userLinkList.addUser(client);
textarea.append("用户"+client.username+"上线"+"\n");
textfield.setText("在线用户"+userLinkList.getCount()+"人\n");
recvThread=newServerReceive(textarea,textfield,
combobox,client,userLinkList);
recvThread.start();
}
catch(Exceptione){
}
}
}
}
********************************ServerReceive.java***********************
/*
*服务器收发消息的类
*/
publicclassServerReceiveextendsThread{
JTextAreatextarea;
JTextFieldtextfield;
JComboBoxcombobox;
Nodeclient;
UserLinkListuserLinkList;//用户链表
publicbooleanisStop;
publicServerReceive(JTextAreatextarea,JTextFieldtextfield,
JComboBoxcombobox,Nodeclient,UserLinkListuserLinkList){
this.textarea=textarea;
this.textfield=textfield;
this.client=client;
this.userLinkList=userLinkList;
bobox=combobox;
isStop=false;
}
publicvoidrun(){
//向所有人发送用户的列表
sendUserList();
while(!
isStop&&!
client.socket.isClosed()){
try{
Stringtype=(String)client.input.readObject();
if(type.equalsIgnoreCase("聊天信息")){
StringtoSomebody=(String)client.input.readObject();
Stringstatus=(String)client.input.readObject();
Stringaction=(String)client.input.readObject();
Stringmessage=(String)client.input.readObject();
Stringmsg=client.username
+""+action
+"对"
+toSomebody
+"说:
"
+message
+"\n";
if(status.equalsIgnoreCase("悄悄话")){
msg="[悄悄话]"+msg;
}
textarea.append(msg);
if(toSomebody.equalsIgnoreCase("所有人")){
sendToAll(msg);//向所有人发送消息
}
else{
try{
client.output.writeObject("聊天信息");
client.output.flush();
client.output.writeObject(msg);
client.output.flush();
}
catch(Exceptione){
//System.out.println("###"+e);
}
Nodenode=userLinkList.findUser(toSomebody);
if(node!
=null){
node.output.writeObject("聊天信息");
node.output.flush();
node.output.writeObject(msg);
node.output.flush();
}
}
}
elseif(type.equalsIgnoreCase("用户下线")){
Nodenode=userLinkList.findUser(client.username);
userLinkList.delUser(node);
Stringmsg="用户"+client.username+