JAVA聊天室.docx

上传人:牧羊曲112 文档编号:3159664 上传时间:2023-03-11 格式:DOCX 页数:60 大小:53.64KB
返回 下载 相关 举报
JAVA聊天室.docx_第1页
第1页 / 共60页
JAVA聊天室.docx_第2页
第2页 / 共60页
JAVA聊天室.docx_第3页
第3页 / 共60页
JAVA聊天室.docx_第4页
第4页 / 共60页
JAVA聊天室.docx_第5页
第5页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《JAVA聊天室.docx》由会员分享,可在线阅读,更多相关《JAVA聊天室.docx(60页珍藏版)》请在三一办公上搜索。

1、JAVA聊天室基于JAVA的聊天室设计与实现 一、 设计目的: 信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生巨大影响。 聊天室是一项应用广泛,并且实用性强的一个非常典型的

2、人机交互系统。在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。 二、需求分析 人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。 根据目前使用聊天室的用户需求显示,用户对于聊

3、天室主要有以下几点要求: 、聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。 、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。 、文件传输功能:用户可以共享资源,能发送及接收文件。 、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。 、系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。 该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊

4、天和基本的用户功能,登录、注销、查看在线用户等。 三、软件功能描述 (1)、用户设置: 功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名; (2)、登录功能: 功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态; (3)、公聊: 功能描述:用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。 、私聊: 功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。双方的聊天记录对于聊天室的其他用户是不可见的。 、聊天心情: 功能描述:用户在聊天的过程中可以

5、选择相应的心情来表达自己的情感。 、系统消息: 功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。 (7)、用户的状态. 功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。 、用户注销: 功能描述:用户可以注销自己的账号,并重新登记登录名和地址。 、用户退出: 功能描述:用户可以在正常情况下退出聊天室。 、服务端控制: 功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。 四: 主要模块描述及流程图 1、 模块描述 本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之

6、间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易服务器采用多线程1 以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:127.0.0.1默认端口为8888。 聊天室服务端模块图: 端口服务 启动服务 停止服务 发送系统消息 退出 服务器 消息显示 聊天室服务端 端口服务:输入要侦听的端口,默认为8888; 启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天; 停止服务:关

7、闭服务器,侦听结束。客户端用户不能再聊天; 发送系统消息:服务器端给所有人或者个别用户发送消息。 消息显示:可以显示所有用户的聊天记录,和上线、下线信息。 退出服务器:退出程序,并停止服务; 聊天室客户端模块图: 退出 用户设置 连接设置 用户登录 用户注销 发送 /接收聊天消息 聊天室客户端 2 用户设置:用户可以设置自己的用户名进行聊天; 连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:127.0.0.1:8888; 用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置; 用户注销:退出聊天,可以继续

8、修改用户设置和连接设置; 发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息; 退出:关闭所有聊天并退出客户端。 2、 流程图 设置侦听端口 聊天室服务器 端口服务 默认端口:8888 聊天 登录 设置用户名 用户设置 启动服务 聊天室客户端 默认连接地址或用户名 设置IP地址和端口 退出 连接设置 3 五.主要类UML关系图: 聊天室服务器端设计: JFrame ActionListener ChatServer -port:public static in -serverSocket:ServerSocket -messageShow:JTe

9、xtArea -userLinkList:UserLinkList -showStatus:JTextField + ChatServer:public +init:public void +startService:public void +stopService:public void +sendStopToAll:public void +sendMsgToAll(String):public void Thread ServerListen - server: ServerSocket - userLinkList :UserLinkList - isStop: public Bool

10、ean +ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList) ServerReceive -textarea:JTextArea - userLinkList :UserLinkList - isStop: public Boolean +ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList) 1、聊天室服务器端设计: + sendSystemMessage:public void 聊天室服务端主要包括7个文件,它们的功

11、能如下: ChatServer.java:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。 ServerListen.java:该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。 ServerReceive.java:该类是实现服务器端的消息的收发的类。该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示

12、在主界面类的界面上。 PortConf.java:该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类。 Node.java:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。 UserLinkList.java:用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索4 引查找用户这5个方法。 Help.java:服务端程序的帮助类。 聊天室客户端设计: ActionListener JFrame ChatClient -port:public static in -serverS

13、ocket:ServerSocket -messageShow:JTextArea -userLinkList:UserLinkList -showStatus:JTextField + ChatClient:public +init:public void +Connect:public void +DisConnect:public void +SendMessage:public void Thread ClientReceive - socket: Socket -output:ObjectOutputStream -input:ObjectInputStream +ClientRec

14、eive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField ) 聊天室客户端主要包括5个文件,它们的功能如下: ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect与DisConnect方法实现与服务器的连接与断开连接。当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage方法来向其他用户发送带有表情的消息或者悄悄话。 ClientRece

15、ive.java:该类是实现服务器端与客户端消息收发的类。 ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。 UserConf.java:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。 Help.java:客户端程序的帮助类。 5 六.主要程序代码清单和注释说明: * ChatServer.java* public void actionPerformed(ActionEvent e) Object obj = e.getSource; if (obj = startServer | obj =

16、 startItem) /启动服务端 startService; else if (obj = stopServer | obj = stopItem) /停止服务端 int j=JOptionPane.showConfirmDialog( this,真的停止服务吗?,停止服务, JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if (j = JOptionPane.YES_OPTION) stopService; else if (obj = portSet | obj = portItem) /端口设置 /调出端口设置的对话框 P

17、ortConf portConf = new PortConf(this); portConf.show; else if (obj = exitButton | obj = exitItem) /退出程序 int j=JOptionPane.showConfirmDialog( this,真的要退出吗?,退出, JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if (j = JOptionPane.YES_OPTION) stopService; System.exit(0); else if (obj = helpItem) /菜

18、单栏中的帮助 /调出帮助对话框 Help helpDialog = new Help(this); helpDialog.show; else if (obj = sysMessage | obj = sysMessageButton) /发送系统消息 sendSystemMessage; /* * 启动服务端 */ 6 public void startService try serverSocket = new ServerSocket(port,10); messageShow.append(服务端已经启动,在+port+端口侦听.n); startServer.setEnabled(f

19、alse); startItem.setEnabled(false); portSet.setEnabled(false); portItem.setEnabled(false); stopServer .setEnabled(true); stopItem .setEnabled(true); sysMessage.setEnabled(true); catch (Exception e) /System.out.println(e); userLinkList = new UserLinkList; listenThread = new ServerListen(serverSocket,

20、combobox, messageShow,showStatus,userLinkList); listenThread.start; /* * 关闭服务端 */ public void stopService try /向所有人发送服务器关闭的消息 sendStopToAll; listenThread.isStop = true; serverSocket.close; int count = userLinkList.getCount; int i =0; while( i count) Node node = userLinkList.findUser(i); node.input .

21、close; node.output.close; node.socket.close; i +; stopServer .setEnabled(false); 7 stopItem .setEnabled(false); startServer.setEnabled(true); startItem.setEnabled(true); portSet.setEnabled(true); portItem.setEnabled(true); sysMessage.setEnabled(false); messageShow.append(服务端已经关闭n); combobox.removeAl

22、lItems; combobox.addItem(所有人); catch(Exception e) /System.out.println(e); /* * 向所有人发送服务器关闭的消息 */ public void sendStopToAll int count = userLinkList.getCount; int i = 0; while(i count) Node node = userLinkList.findUser(i); if(node = null) i +; continue; try node.output.writeObject(服务关闭); node.output.

23、flush; catch (Exception e) /System.out.println($+e); i+; /* * 向所有人发送消息 */ public void sendMsgToAll(String msg) int count = userLinkList.getCount;/用户总数 int i = 0; while(i count) Node node = userLinkList.findUser(i); if(node = null) 8 i +; continue; try node.output.writeObject(系统信息); node.output.flush

24、; node.output.writeObject(msg); node.output.flush; catch (Exception e) /System.out.println(+e); i+; sysMessage.setText(); /* * 向客户端用户发送消息 */ public void sendSystemMessage String toSomebody = combobox.getSelectedItem.toString; String message = sysMessage.getText + n; messageShow.append(message); /向所有

25、人发送消息 if(toSomebody.equalsIgnoreCase(所有人) sendMsgToAll(message); else /向某个用户发送消息 Node node = userLinkList.findUser(toSomebody); try node.output.writeObject(系统信息); node.output.flush; node.output.writeObject(message); node.output.flush; catch(Exception e) /System.out.println(!+e); sysMessage.setText()

26、;/将发送消息栏的消息清空 public static void main(String args) ChatServer app = new ChatServer; 9 *ServerListen.java: * public class ServerListen extends Thread ServerSocket server; JComboBox combobox; JTextArea textarea; JTextField textfield; UserLinkList userLinkList;/用户链表 Node client; ServerReceive recvThrea

27、d; public boolean isStop; /* * 聊天服务端的用户上线于下线侦听类 */ public ServerListen(ServerSocket server,JComboBox combobox, JTextArea textarea,JTextField textfield,UserLinkList userLinkList) this.server = server; bobox = combobox; this.textarea = textarea; this.textfield = textfield; this.userLinkList = userLink

28、List; isStop = false; public void run while(!isStop & !server.isClosed) try client = new Node; client.socket = server.accept; client.output = new ObjectOutputStream(client.socket.getOutputStream); client.output.flush; client.input = new ObjectInputStream(client.socket.getInputStream); client.usernam

29、e = (String)client.input.readObject; /显示提示信息 combobox.addItem(client.username); userLinkList.addUser(client); textarea.append(用户 + client.username + 上线 + n); textfield.setText(在线用户 + userLinkList.getCount + 人n); recvThread = new ServerReceive(textarea,textfield, 10 combobox,client,userLinkList); rec

30、vThread.start; catch(Exception e) *ServerReceive.java* /* * 服务器收发消息的类 */ public class ServerReceive extends Thread JTextArea textarea; JTextField textfield; JComboBox combobox; Node client; UserLinkList userLinkList;/用户链表 public boolean isStop; public ServerReceive(JTextArea textarea,JTextField text

31、field, JComboBox combobox,Node client,UserLinkList userLinkList) this.textarea = textarea; this.textfield = textfield; this.client = client; this.userLinkList = userLinkList; bobox = combobox; isStop = false; public void run /向所有人发送用户的列表 sendUserList; while(!isStop & !client.socket.isClosed) try Str

32、ing type = (String)client.input.readObject; if(type.equalsIgnoreCase(聊天信息) String toSomebody = (String)client.input.readObject; String status = (String)client.input.readObject; String action = (String)client.input.readObject; String message = (String)client.input.readObject; String msg = client.user

33、name 11 + + 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.fl

34、ush; catch (Exception e) /System.out.println(#+e); Node node = userLinkList.findUser(toSomebody); if(node != null) node.output.writeObject(聊天信息); node.output.flush; node.output.writeObject(msg); node.output.flush; else if(type.equalsIgnoreCase(用户下线) Node node = userLinkList.findUser(client.username)

35、; userLinkList.delUser(node); String msg = 用户 + client.username + 下线n; int count = userLinkList.getCount; combobox.removeAllItems; combobox.addItem(所有人); int i = 0; while(i count) 12 n); /* * 向所有人发送消息 */ public void sendToAll(String msg) int count = userLinkList.getCount; int i = 0; while(i count) N

36、ode node = userLinkList.findUser(i); if(node = null) i +; continue; try catch (Exception e) /System.out.println(e); node.output.writeObject(聊天信息); node.output.flush; node.output.writeObject(msg); node.output.flush; catch (Exception e) /System.out.println(e); sendToAll(msg);/向所有人发送消息 sendUserList;/重新

37、发送用户列表,刷新 break; combobox.setSelectedIndex(0); textarea.append(msg); textfield.setText(在线用户 + userLinkList.getCount + 人node = userLinkList.findUser(i); if(node = null) i +; continue; combobox.addItem(node.username); i+; 13 i+; /* * 向所有人发送用户的列表 */ public void sendUserList String userlist = ; int coun

38、t = userLinkList.getCount; int i = 0; while(i count) Node node = userLinkList.findUser(i); if(node = null) i +; userlist += node.username; userlist += n; i+; continue; i = 0; while(i count) Node node = userLinkList.findUser(i); if(node = null) i +; continue; try node.output.writeObject(用户列表); node.o

39、utput.flush; node.output.writeObject(userlist); node.output.flush; catch (Exception e) /System.out.println(e); i+; *PortConf.java* /* * 生成端口设置对话框的类 */ 14 public class PortConf extends JDialog JPanel panelPort = new JPanel; JButton save = new JButton; JButton cancel = new JButton; public static JLabe

40、l DLGINFO=new JLabel( 默认端口号为:8888); JPanel panelSave = new JPanel; JLabel message = new JLabel; public static JTextField portNumber ; public PortConf(JFrame frame) super(frame, true); try jbInit; catch (Exception e) e.printStackTrace; /设置运行位置,使对话框居中 Dimension screenSize = Toolkit.getDefaultToolkit.g

41、etScreenSize; this.setLocation( (int) (screenSize.width - 400) / 2 + 50, (int) (screenSize.height - 600) / 2 + 150); this.setResizable(false); private void jbInit throws Exception this.setSize(new Dimension(300, 120); this.setTitle(端口设置); message.setText(请输入侦听的端口号:); portNumber = new JTextField(10); portNumber.setText(+ChatServer.port); save.setText(保存); cancel.setText(取消); panelPort.setLayout(new FlowLayout); panelPort.add(message); panelPort.add(portNumber); panelSave.add(new Label( ); panelSave.add(save); panelSave.add(cancel); panelSave.add(new Label( );

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号