![[理学]JAVA聊天室.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-1/5/104f96db-8f8e-4016-ab53-8cedf9f14eec/104f96db-8f8e-4016-ab53-8cedf9f14eec1.gif)
![[理学]JAVA聊天室.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-1/5/104f96db-8f8e-4016-ab53-8cedf9f14eec/104f96db-8f8e-4016-ab53-8cedf9f14eec2.gif)
![[理学]JAVA聊天室.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-1/5/104f96db-8f8e-4016-ab53-8cedf9f14eec/104f96db-8f8e-4016-ab53-8cedf9f14eec3.gif)
![[理学]JAVA聊天室.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-1/5/104f96db-8f8e-4016-ab53-8cedf9f14eec/104f96db-8f8e-4016-ab53-8cedf9f14eec4.gif)
![[理学]JAVA聊天室.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-1/5/104f96db-8f8e-4016-ab53-8cedf9f14eec/104f96db-8f8e-4016-ab53-8cedf9f14eec5.gif)
已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于JAVA的聊天室的设计与实现 计算机072 周蔓 0708140822基于JAVA的聊天室设计与实现一、 设计目的:信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生巨大影响。聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。二、需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1)、聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。(2)、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。(3)、文件传输功能:用户可以共享资源,能发送及接收文件。(4)、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。(5)、系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、注销、查看在线用户等。三、软件功能描述 (1)、用户设置:功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)、登录功能:功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;(3)、公聊:功能描述:用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。(4)、私聊:功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。双方的聊天记录对于聊天室的其他用户是不可见的。(5)、聊天心情:功能描述:用户在聊天的过程中可以选择相应的心情来表达自己的情感。(6)、系统消息:功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。 (7)、用户的状态.功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。(8)、用户注销:功能描述:用户可以注销自己的账号,并重新登记登录名和地址。(9)、用户退出:功能描述:用户可以在正常情况下退出聊天室。(10)、服务端控制:功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。四: 主要模块描述及流程图1、 模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:默认端口为8888。(1)聊天室服务端模块图:聊天室服务端发送系统消息退出服务器消息显示停止服务启动服务端口服务端口服务:输入要侦听的端口,默认为8888;启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;停止服务:关闭服务器,侦听结束。客户端用户不能再聊天;发送系统消息:服务器端给所有人或者个别用户发送消息。消息显示:可以显示所有用户的聊天记录,和上线、下线信息。退出服务器:退出程序,并停止服务;(2)聊天室客户端模块图:聊天室客户端用户设置用户注销发送/接收聊天消息退出用户登录连接设置用户设置:用户可以设置自己的用户名进行聊天;连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为::8888;用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;用户注销:退出聊天,可以继续修改用户设置和连接设置;发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;退出:关闭所有聊天并退出客户端。2、 流程图聊天室服务器启动服务端口服务 设置侦听端口 默认端口:8888聊天登录用户设置聊天室客户端 设置用户名 默认连接地址或用户名连接设置退出 设置IP地址和端口五.主要类UML关系图:ActionListenerChatServer-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ ChatServer():public+init():public void +startService():public void+stopService():public void +sendStopToAll():public void+sendMsgToAll(String):public void+ sendSystemMessage():public voidJFrameThreadServerListen- server: ServerSocket- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)聊天室服务器端设计:ServerListen- server: ServerSocket- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)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:服务端程序的帮助类。Thread聊天室客户端设计:ActionListenerChatClient-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ ChatClient():public+init():public void +Connect():public void+DisConnect():public void +SendMessage():public voidJFrameClientReceive- socket: Socket-output:ObjectOutputStream-input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField )聊天室客户端主要包括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*public void actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = startServer | obj = 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) /端口设置/调出端口设置的对话框PortConf 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) /菜单栏中的帮助/调出帮助对话框Help helpDialog = new Help(this);helpDialog.show();else if (obj = sysMessage | obj = sysMessageButton) /发送系统消息sendSystemMessage();/* * 启动服务端 */public void startService()tryserverSocket = new ServerSocket(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 (Exception e)/System.out.println(e);userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,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 .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(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;trynode.output.writeObject(服务关闭);node.output.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) i +;continue;trynode.output.writeObject(系统信息);node.output.flush();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);/向所有人发送消息if(toSomebody.equalsIgnoreCase(所有人)sendMsgToAll(message);else/向某个用户发送消息Node node = userLinkList.findUser(toSomebody);trynode.output.writeObject(系统信息);node.output.flush();node.output.writeObject(message);node.output.flush();catch(Exception e)/System.out.println(!+e);sysMessage.setText();/将发送消息栏的消息清空public static void main(String args) ChatServer app = new ChatServer();*ServerListen.java: *public class ServerListen extends Thread ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;/用户链表Node client;ServerReceive recvThread;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 = userLinkList;isStop = false;public void run()while(!isStop & !server.isClosed()tryclient = new Node();client.socket = server.accept();client.output = new ObjectOutputStream(client.socket.getOutputStream();client.output.flush();client.input = new ObjectInputStream(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 = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.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 textfield,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()tryString 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.username + + action+ 对 + toSomebody + 说 : + message+ n;if(status.equalsIgnoreCase(悄悄话)msg = 悄悄话 + msg;textarea.append(msg);if(toSomebody.equalsIgnoreCase(所有人)sendToAll(msg);/向所有人发送消息elsetryclient.output.writeObject(聊天信息);client.output.flush();client.output.writeObject(msg);client.output.flush();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);userLinkList.delUser(node);String msg = 用户 + client.username + 下线n;int count = userLinkList.getCount();combobox.removeAllItems();combobox.addItem(所有人);int i = 0;while(i count)node = userLinkList.findUser(i);if(node = null) i +;continue; combobox.addItem(node.username);i+;combobox.setSelectedIndex(0);textarea.append(msg);textfield.setText(在线用户 + userLinkList.getCount() + 人n);sendToAll(msg);/向所有人发送消息sendUserList();/重新发送用户列表,刷新break;catch (Exception e)/System.out.println(e);/* * 向所有人发送消息 */public void sendToAll(String msg)int count = userLinkList.getCount();int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue;trynode.output.writeObject(聊天信息);node.output.flush();node.output.writeObject(msg);node.output.flush();catch (Exception e)/System.out.println(e);i+;/* * 向所有人发送用户的列表 */public void sendUserList()String userlist = ;int count = userLinkList.getCount();int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue;userlist += node.username;userlist += n;i+;i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue; trynode.output.writeObject(用户列表);node.output.flush();node.output.writeObject(userlist);node.output.flush();catch (Exception e)/System.out.println(e);i+;*PortConf.java*/* * 生成端口设置对话框的类 */public class PortConf extends JDialog JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel 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().getScreenSize();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( );Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout();contentPane.add(panelPort, BorderLayout.NORTH);contentPane.add(DLGINFO, BorderLayout.CENTER);contentPane.add(panelSave, BorderLayout.SOUTH);/保存按钮的事件处理save.addActionListener(new ActionListener() public void actionPerformed (ActionEvent a) int savePort;trysavePort=Integer.parseInt(PortConf.portNumber.getText();if(savePort65535)PortConf.DLGINFO.setText( 侦听端口必须是0-65535之间的整数!);PortConf.portNumber.setText();return;ChatServer.port = savePort;dispose();catch(NumberFormatException e)PortConf.DLGINFO.setText( 错误的端口号,端口号请填写整数!);PortConf.portNumber.setText();return;);/关闭对话框时的操作this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)DLGINFO.setText( 默认端口号为:8888););/取消按钮的事件处理cancel.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)DLGINFO.setText( 默认端口号为:8888);dispose(););*Node.java*/* * 用户链表的结点类 */public class Node String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;Node next = null;*UserLinkList.java*/* * 用户链表 */public class UserLinkList Node root;Node pointer;int count;/* * 构造用户链表 */public UserLinkList()root = new Node();root.next = null;pointer = null;count = 0;/* * 添加用户 */public void addUser(Node n)pointer = root;while(pointer.next != null)pointer = point
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度整车运输与车辆融资租赁代理合同
- 二零二五年度高端实木地板品牌授权买卖合同模板
- 二零二五年度土地承包经营权投资合作合同范本
- 2025版冷链运输货车司机劳动合同及服务协议
- 二零二五年度沙漠化防治项目树木采购合同样本
- 二零二五年太阳能路灯安装与维护服务协议
- 2025版商场畅销商品组合陈列协议书模板
- 二零二五年度环保型地下室买卖合同样本
- 2025版虚拟现实设备独家代理销售合同
- 2025版XX农业科技园区合作协议范本
- 小学中段语文课堂随文小练笔的策略探究
- 办公窗帘采购 投标方案(技术方案)
- 2025年永诚财产保险股份有限公司招聘笔试参考题库含答案解析
- 2025年度页岩气开采井钻探及技术服务合同2篇
- 2025年中铁水务集团有限公司招聘笔试参考题库含答案解析
- 蒸汽管道工程施工方案
- 夏季预防空调病宣传
- 营养指导员技能实践考试题
- DB41T 1338-2016 石窟文物三维数字化技术规范
- psw零件提交保证书
- 2024年新华社招聘笔试参考题库附带答案详解
评论
0/150
提交评论