![点击分享此内容可以赚币 分享](/master/images/share_but.png)
java专业课程设计方案报告java聊天室.doc
《java专业课程设计方案报告java聊天室.doc》由会员分享,可在线阅读,更多相关《java专业课程设计方案报告java聊天室.doc(58页珍藏版)》请在咨信网上搜索。
Java聊天室课程设计 一、 需求分析 1.1开发背景 在信息化社会今天,网络飞速发展,大家对网络依靠越来越多,越来越离不开网络,由此而产生聊天工具越来越多,类似MSN、QQ,网络聊天时一类聊天系统发展日新月异,所以产生了制作一个类似QQ网络聊天工具想法,且经过制作该程序还能愈加好学习网络软件编程知识。 网络编程目标就是指直接或间接地经过网络协议和其它计算机进行通讯。网编程中有两个关键问题,一个是怎样正确定位网络上一台或多台主机,另一个就是找到主机后怎样可靠高效进行数据传输。在TCP/IP协议中IP层关键负责网络主机定位,数据传输路由,由IP地址能够唯一地确定Internet上一台主机。而TCP层则提供面向应用可靠或非可靠数据传输机制,这是网络编程关键对象,通常不需要关心IP层是怎样处理数据。现在较为流行网络编程模型是用户机/服务器(C/S)结构。即通信双方一方作为服务器等候用户提出请求并给予响应。用户则在需要服务时向服务器提出申请。服务器通常作为守护进程一直运行,监听网络端口,一旦有用户请求,就会开启一个服务进程来响应该用户,同时自己继续监听服务端口,使以后用户也得到响应服务。 1.2设计要求 本课程设计目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,用户机器向服务器发聊天请求,服务器应答并能显示用户机发过来信息。 1.3设计目标 经过设计一个网络聊天程序,对套接字、数据报通讯、URL、和URLConnectiom相关知识有具体了解和充足认识。能将相关只是利用到相关实践中去。 1.4功效实现 聊天室共分为用户端和服务端两部分,服务器程序关键负责侦听用户端发来消息,用户端需要登录到对应服务器才能够实现正常聊天功效。 服务器关键功效有 1) 在特定端口上进行侦听,等候用户连接 2) 用户能够配置服务器真挺端口 3) 向已经连接服务器用户发送系统消息 4) 统计在线人数 5) 当停止服务时,断开全部用户连接 用户端关键功效 1) 连接到已经开启聊天服务服务端 2) 用户能够配置要连接服务器端ip地址和端口号 3) 用户能够配置连接后显示用户名 4) 当服务器开启时。用户能够随时登陆和注销 5) 用户能够向全部些人或一个人发送消息 二、 总体设计 2.1设计思想 套接字对象在网络编程中饰演者关键角色,能够用套接字技术编写一个聊天室,服务器为每个用户开启一个线程。在该线程中经过套接字和用户交流信息,当用户向服务器发送一条聊天信息“大家好”时,服务器要让全部这些线程中输入流写入信息大家好,这么全部用户套接字输入流就全部读取到了这一条信息。假如把信息“你好”发送给特定用户,服务器就让特定线程中输出流写入信息“你好”,那么只有特定用户套机字输入流能够读取到这条信息。 在聊天室中需要对用户上线下线状态进行修改,进而统计在线人数、查找某用户等。所以需要用到java链表来实现。因为Java语言不像c或c++一样能够利用线性表链式存放结构,用节点和指针来表示,在Java中是没有指针,不过能够经过使用对象引用来实现链表。链表结点个数称为链表长度。所以在Java中能够定义两个类来实现链表操作,分别为节点类和链表类。在本设计中对用户存放就是利用链表来实现。 2.2基础设计概念和处理步骤 本系统运行用JAVA开发,采取C\S结构,系统分为客服端和服务端两大模块,使用Socket类建立套接字实现客服端和服务端得通讯。 处理步骤 用户端 服务端 发送请求 处理请求 服务端 用户端 一个ServerSocket对象和一个Socket对象 一个Socketd对象 ServerSocket(port)创建ServerSocket对象提供TCP连接服务 Accept() 在指定端口等候用户端连接请求 连接成功,取得一个已连接socket对象 InputStream 读取Socket对象输入流 OutputStream 写入Socket对象输出流 InputStream 读取Socket对象输入流 OutputStream 写入Socket对象输出流 Socket(host,port)创建Socket对象,向指定主机端口发出连接请求 Socket.close() 关闭TCP连接 ServerSocket.close() 停止提供TCP连接服务 Socket.close() 关闭TCP连接 建立Socket连接 申请连接 经过流传送数据 TCP Socket通信步骤 2.3总体结构 网络聊天室 服务端 客服端 2.4功效分配 用户端 向全部些人或一个人发送消息 用户端 连接服务端 配置服务端 登录和注销 服务端 服务端 等候用户连接 配置服务器侦听端口 向用户发送系统消息 统计在线人数、断开连接等 2.5接口设计 2.5.1用户接口 提供一个用户操作界面:包含用户能够再界面中登录聊天室、输入消息、浏览聊天内容和聊天对象。 同时提供一个服务器操作界面,经过服务器操作界面能够修改服务器配置,知道用户目前状态,并能够给用户发送指定系统信息。 2.5.2内部接口 Socket(string hont ,int port ); 用户端使用Socket类建立和服务器套接字连接。 ServerSocket(int port); 建立接收用户套接字服务器套接字。 2.6关键模块 2.6.1聊天室服务器端模块 聊天室服务器端模块关键有以下几部分组成 1、 主框架类(ChatServer.java) 该文件包含名为ChatServerpublic类,其关键功效是定义服务器界面,添加事件侦听鱼事件处理。ChatServer类调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。 2、 服务器用户上线和下线侦听类。 该类对用户上线和下线侦听是经过调用用户链表类来实现,当用户上线和下线情况发生改变时,该类会对主类界面进行对应修改。 3、 服务器消息收发类 该类分别定义了向某用户及向全部些人发送消息方法,发送消息会显示在主界面类界面上。 4用户修改配置类。 该类继承自JDialog。使用户对服务器端口进行修改配置类。 5节点类 定义了链表中用户 6链表类 该类经过结构函数结构用户链表,定义了添加用户、删除用户、返回用户数、依据用户名查找用户和各依据索引查找用户等方法。 7服务器帮助类、 2.6.2聊天室服务器端模块算法描述 ActionListener ChatServer -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 void JFrame Thread ServerListen - 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) 服务器端ChatServer类继承自JFrame并实现对应事件监听接口,所以它定义了服务器主框架,及各个按钮事件监听。它分别调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。同时服务器能够响应多个用户请求,当一个用户发送请求时,服务器就为它增加一个线程,同时服务器利用UserLinkList类为用户端设置一个请求队列,假如服务器不能立即响应用户端请求,就要把这个请求放到请求队列在中,,等服务器将目前请求处理完,会自动到请求队列中根据前后次序取出请求进行处理。 2.6.3聊天室用户端模块 用户端关键有以下多个文件,功效以下: 1用户端主框架类 该类关键定义用户端界面,添加事件侦听和事件处理。该类定义了和服务器实现连接和断开连接方法。当用户登录到指定服务器上时,该类条用用户端实现消息收发类实现消息收发。同时该类定义了向全部用户发送消息方法。 2用户端消息收发类 该类实现了服务器和用户端消息收发 3用户修改配置类 该类继承自JDialog,是用户对要连接服务器IP及侦听端口进行修改配置类。 4帮助类 用户端用户程序帮助类 2.6.4聊天室用户端模块关键算法描述 ActionListener ChatClient -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 void JFrame Thread ClientReceive - socket: Socket -output:ObjectOutputStream -input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,ObjectIn JComboBox,JTextArea,JTextField ) 用户端ChatClient类继承了JFrame并实现对应事件监听接口。它实现了用户端主界面及对应按钮事件侦听。该类调用ClientReceive类实现消息收发。同时该类定义了向全部用户发送消息方法。经过对应输入输出流和服务器进行数据传输和交流。 三、 关键代码实现 3.1服务器关键代码实现 1、Chatserver类:包含名为ChatServerpublic类,其关键功效为定义服务器端界面,添加事件侦听和事件处理。调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息收发。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import .*; import java.io.*; /* * 聊天服务端主框架类 */ public class ChatServer extends JFrame implements ActionListener{ public static int port = 8888;//服务端侦听端口 ServerSocket serverSocket;//服务端Socket Image icon;//程序图标 JComboBox combobox;//选择发送消息接收者 JTextArea messageShow;//服务端信息显示 JScrollPane messageScrollPane;//信息显示滚动条 JTextField showStatus;//显示用户连接状态 JLabel sendToLabel,messageLabel; JTextField sysMessage;//服务端消息发送 JButton sysMessageButton;//服务端消息发送按钮 UserLinkList userLinkList;//用户链表 //建立菜单栏 JMenuBar jMenuBar = new JMenuBar(); //建立菜单组 JMenu serviceMenu = new JMenu ("服务(V)"); //建立菜单项 JMenuItem portItem = new JMenuItem ("端口设置(P)"); JMenuItem startItem = new JMenuItem ("开启服务(S)"); JMenuItem stopItem=new JMenuItem ("停止服务(T)"); JMenuItem exitItem=new JMenuItem ("退出(X)"); JMenu helpMenu=new JMenu ("帮助(H)"); JMenuItem helpItem=new JMenuItem ("帮助(H)"); //建立工具栏 JToolBar toolBar = new JToolBar(); //建立工具栏中按钮组件 JButton portSet;//开启服务端侦听 JButton startServer;//开启服务端侦听 JButton stopServer;//关闭服务端侦听 JButton exitButton;//退出按钮 //框架大小 Dimension faceSize = new Dimension(400, 600); ServerListen listenThread; JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon; /** * 服务端结构函数 */ public ChatServer(){ init();//初始化程序 //添加框架关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //设置框架大小 this.setSize(faceSize); //设置运行时窗口位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2, (int) (screenSize.height - faceSize.getHeight()) / 2); this.setResizable(false); this.setTitle("聊天室服务端"); //设置标题 //程序图标 icon = getImage("icon.gif"); this.setIconImage(icon); //设置程序图标 show(); //为服务菜单栏设置热键'V' serviceMenu.setMnemonic('V'); //为端口设置快捷键为ctrl+p portItem.setMnemonic ('P'); portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK)); //为开启服务快捷键为ctrl+s startItem.setMnemonic ('S'); startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK)); //为端口设置快捷键为ctrl+T stopItem.setMnemonic ('T'); stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK)); //为退出设置快捷键为ctrl+x exitItem.setMnemonic ('X'); exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK)); //为帮助菜单栏设置热键'H' helpMenu.setMnemonic('H'); //为帮助设置快捷键为ctrl+p helpItem.setMnemonic ('H'); helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK)); } /** * 程序初始化函数 */ public void init(){ Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); //添加菜单栏 serviceMenu.add (portItem); serviceMenu.add (startItem); serviceMenu.add (stopItem); serviceMenu.add (exitItem); jMenuBar.add (serviceMenu); helpMenu.add (helpItem); jMenuBar.add (helpMenu); setJMenuBar (jMenuBar); //初始化按钮 portSet = new JButton("端口设置"); startServer = new JButton("开启服务"); stopServer = new JButton("停止服务" ); exitButton = new JButton("退出" ); //将按钮添加到工具栏 toolBar.add(portSet); toolBar.addSeparator();//添加分隔栏 toolBar.add(startServer); toolBar.add(stopServer); toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); //初始时,令停止服务按钮不可用 stopServer.setEnabled(false); stopItem .setEnabled(false); //为菜单栏添加事件监听 portItem.addActionListener(this); startItem.addActionListener(this); stopItem.addActionListener(this); exitItem.addActionListener(this); helpItem.addActionListener(this); //添加按钮事件侦听 portSet.addActionListener(this); startServer.addActionListener(this); stopServer.addActionListener(this); exitButton.addActionListener(this); combobox = new JComboBox(); combobox.insertItemAt("全部些人",0); combobox.setSelectedIndex(0); messageShow = new JTextArea(); messageShow.setEditable(false); //添加滚动条 messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(new Dimension(400,400)); messageScrollPane.revalidate(); showStatus = new JTextField(35); showStatus.setEditable(false) sysMessage = new JTextField(24); sysMessage.setEnabled(false); sysMessageButton = new JButton(); sysMessageButton.setText("发送"); //添加系统消息事件侦听 sysMessage.addActionListener(this); sysMessageButton.addActionListener(this); sendToLabel = new JLabel("发送至:"); messageLabel = new JLabel("发送消息:"); downPanel = new JPanel(); girdBag = new GridBagLayout(); downPanel.setLayout(girdBag); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 0; girdBagCon.gridwidth = 3; girdBagCon.gridheight = 2; girdBagCon.ipadx = 5; girdBagCon.ipady = 5; JLabel none = new JLabel(" "); girdBag.setConstraints(none,girdBagCon); downPanel.add(none); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 2; girdBagCon.insets = new Insets(1,0,0,0); girdBagCon.ipadx = 5; girdBagCon.ipady = 5; girdBag.setConstraints(sendToLabel,girdBagCon); downPanel.add(sendToLabel); girdBagCon = new GridBagConstraints(); girdBagCon.gridx =1; girdBagCon.gridy = 2; girdBagCon.anchor = GridBagConstraints.LINE_START; girdBag.setConstraints(combobox,girdBagCon); downPanel.add(combobox); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 3; girdBag.setConstraints(messageLabel,girdBagCon); downPanel.add(messageLabel); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 1; girdBagCon.gridy = 3; girdBag.setConstraints(sysMessage,girdBagCon); downPanel.add(sysMessage); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 2; girdBagCon.gridy = 3; girdBag.setConstraints(sysMessageButton,girdBagCon); downPanel.add(sysMessageButton); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 4; girdBagCon.gridwidth = 3; girdBag.setConstraints(showStatus,girdBagCon); downPanel.add(showStatus); contentPane.add(messageScrollPane,BorderLayout.CENTER); contentPane.add(downPanel,BorderLayout.SOUTH); //关闭程序时操作 this.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ stopService(); System.exit(0); }}}} /** * 事件处理 */ 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(){ try{ serverSocket = 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; } try{ node.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; } try{ node.output.writeObject("系统信息"); node.output.flush(); node.output.writeObject(msg); node.output.flush(); } catch (Exception e){ //System.out- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 专业课程 设计方案 报告 聊天室
![提示](https://www.zixin.com.cn/images/bang_tan.gif)
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文