JAVA聊天室Word文档下载推荐.docx
《JAVA聊天室Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JAVA聊天室Word文档下载推荐.docx(63页珍藏版)》请在冰豆网上搜索。
(3)、公聊:
用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。
〔4〕、私聊:
用户可以选择与聊天室的在线用户列表中的其他用户聊天。
双方的聊天记录对于聊天室的其他用户是不可见的。
〔5〕、聊天心情:
用户在聊天的过程中可以选择相应的心情来表达自己的情感。
〔6〕、系统消息:
服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。
(7)、用户的状态.
每一个客户端用户都可以实时看到目前其他在线用户的状态。
〔8〕、用户注销:
用户可以注销自己的账号,并重新登记登录名和地址。
〔9〕、用户退出:
用户可以在正常情况下退出聊天室。
〔10〕、服务端控制:
只有在服务端开启的情况下,用户才能登陆成功和聊天;
用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。
四:
主要模块描述及流程图
1、模块描述
本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。
在java中使用套接口相当简单,JavaAPI为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:
127.0.0.1默认端口为8888。
〔1〕聊天室服务端模块图:
端口服务:
输入要侦听的端口,默认为8888;
启动服务:
启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;
停止服务:
关闭服务器,侦听结束。
客户端用户不能再聊天;
发送系统消息:
服务器端给所有人或者个别用户发送消息。
消息显示:
可以显示所有用户的聊天记录,和上线、下线信息。
退出服务器:
退出程序,并停止服务;
〔2〕聊天室客户端模块图:
用户设置:
用户可以设置自己的用户名进行聊天;
连接设置:
用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:
127.0.0.1:
8888;
用户登录:
只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;
用户注销:
退出聊天,可以继续修改用户设置和连接设置;
发送和接收聊天信息:
用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;
退出:
关闭所有聊天并退出客户端。
2、流程图
设置侦听端口
默认端口:
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){//退出程序
真的要退出吗?
退出"
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(){
//向所有人发送服务器关闭的消息
sendStopToAll();
listenThread.isStop=true;
serverSocket.close();
intcount=userLinkList.getCount();
inti=0;
while(i<
count){
Nodenode=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);
服务端已经关闭\n"
combobox.removeAllItems();
combobox.addItem("
所有人"
catch(Exceptione){
*向所有人发送服务器关闭的消息
publicvoidsendStopToAll(){
intcount=userLinkList.getCount();
inti=0;
while(i<
Nodenode=userLinkList.findUser(i);
if(node==null){
continue;
try{
node.output.writeObject("
服务关闭"
node.output.flush();
catch(Exceptione){
//System.out.println("
$$$"
+e);
i++;
*向所有人发送消息
publicvoidsendMsgToAll(Stringmsg){
//用户总数
系统信息"
node.output.writeObject(msg);
@@@"
sysMessage.setText("
*向客户端用户发送消息
publicvoidsendSystemMessage(){
StringtoSomebody=combobox.getSelectedItem().toString();
Stringmessage=sysMessage.getText()+"
\n"
;
messageShow.append(message);
//向所有人发送消息
if(toSomebody.equalsIgnoreCase("
)){
sendMsgToAll(message);
else{
//向某个用户发送消息
Nodenode=userLinkList.findUser(toSomebody);
node.output.writeObject(message);
catch(Exceptione){
!
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;
thisbobox=combobox;
this.textarea=textarea;
this.textfield=textfield;
this.userLinkList=userLinkList;
isStop=false;
publicvoidrun(){
while(!
isStop&
&
!
server.isClosed()){
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+"
上线"
+"
textfield.setText("
在线用户"
+userLinkList.getCount()+"
人\n"
recvThread=newServerReceive(textarea,textfield,
combobox,client,userLinkList);
recvThread.start();
********************************ServerReceive.java***********************
/*
*服务器收发消息的类
publicclassServerReceiveextendsThread{
publicServerReceive(JTextAreatextarea,JTextFieldtextfield,
JComboBoxcombobox,Nodeclient,UserLinkListuserLinkList){
this.client=client;
//向所有人发送用户的列表
sendUserList();
client.socket.isClosed()){
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
+"
"
+acti