java专业课程设计方案报告java聊天室_第1页
java专业课程设计方案报告java聊天室_第2页
java专业课程设计方案报告java聊天室_第3页
java专业课程设计方案报告java聊天室_第4页
java专业课程设计方案报告java聊天室_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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功效实现聊天室共分为用户端和服务端两部分,服务器程序关键负责侦听用户端发来消息,用户端需要登录到对应服务器才能够实现正常聊天功效。服务器关键功效有在特定端口上进行侦听,等候用户连接用户能够配置服务器真挺端口向已经连接服务器用户发送系统消息统计在线人数当停止服务时,断开全部用户连接用户端关键功效连接到已经开启聊天服务服务端用户能够配置要连接服务器端ip地址和端口号用户能够配置连接后显示用户名当服务器开启时。用户能够随时登陆和注销用户能够向全部些人或一个人发送消息总体设计2.1设计思想套接字对象在网络编程中饰演者关键角色,能够用套接字技术编写一个聊天室,服务器为每个用户开启一个线程。在该线程中经过套接字和用户交流信息,当用户向服务器发送一条聊天信息“大家好”时,服务器要让全部这些线程中输入流写入信息大家好,这么全部用户套接字输入流就全部读取到了这一条信息。假如把信息“你好”发送给特定用户,服务器就让特定线程中输出流写入信息“你好”,那么只有特定用户套机字输入流能够读取到这条信息。在聊天室中需要对用户上线下线状态进行修改,进而统计在线人数、查找某用户等。所以需要用到java链表来实现。因为Java语言不像c或c++一样能够利用线性表链式存放结构,用节点和指针来表示,在Java中是没有指针,不过能够经过使用对象引用来实现链表。链表结点个数称为链表长度。所以在Java中能够定义两个类来实现链表操作,分别为节点类和链表类。在本设计中对用户存放就是利用链表来实现。2.2基础设计概念和处理步骤本系统运行用JAVA开发,采取C\S结构,系统分为客服端和服务端两大模块,使用Socket类建立套接字实现客服端和服务端得通讯。处理步骤用户端用户端服务端发送请求处理请求服务端用户端一个ServerSocket对象和一个Socket对象一个Socketd对象ServerSocket(port)创建ServerSocket对象提供TCP连接服务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连接申请连接经过流传送数据TCPSocket通信步骤2.3总体结构网络聊天室网络聊天室服务端客服端2.4功效分配用户端向全部些人或一个人发送消息用户端向全部些人或一个人发送消息用户端连接服务端配置服务端登录和注销服务端服务端服务端等候用户连接配置服务器侦听端口向用户发送系统消息统计在线人数、断开连接等2.5接口设计2.5.1用户接口提供一个用户操作界面:包含用户能够再界面中登录聊天室、输入消息、浏览聊天内容和聊天对象。同时提供一个服务器操作界面,经过服务器操作界面能够修改服务器配置,知道用户目前状态,并能够给用户发送指定系统信息。2.5Socket(stringhont,intport);用户端使用Socket类建立和服务器套接字连接。ServerSocket(intport);建立接收用户套接字服务器套接字。2.6关键模块2.6聊天室服务器端模块关键有以下几部分组成主框架类(ChatServer.java)该文件包含名为ChatServerpublic类,其关键功效是定义服务器界面,添加事件侦听鱼事件处理。ChatServer类调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。服务器用户上线和下线侦听类。该类对用户上线和下线侦听是经过调用用户链表类来实现,当用户上线和下线情况发生改变时,该类会对主类界面进行对应修改。服务器消息收发类该类分别定义了向某用户及向全部些人发送消息方法,发送消息会显示在主界面类界面上。4用户修改配置类。该类继承自JDialog。使用户对服务器端口进行修改配置类。5节点类定义了链表中用户6链表类该类经过结构函数结构用户链表,定义了添加用户、删除用户、返回用户数、依据用户名查找用户和各依据索引查找用户等方法。7服务器帮助类、2.6ActionListenerActionListenerChatServer-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatServer():public+init():publicvoid+startService():publicvoid+stopService():publicvoid+sendStopToAll():publicvoid+sendMsgToAll(String):publicvoid+sendSystemMessage():publicvoidJFrameThreadServerListen-server:ServerSocket-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)服务器端ChatServer类继承自JFrame并实现对应事件监听接口,所以它定义了服务器主框架,及各个按钮事件监听。它分别调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。同时服务器能够响应多个用户请求,当一个用户发送请求时,服务器就为它增加一个线程,同时服务器利用UserLinkList类为用户端设置一个请求队列,假如服务器不能立即响应用户端请求,就要把这个请求放到请求队列在中,,等服务器将目前请求处理完,会自动到请求队列中根据前后次序取出请求进行处理。2.6用户端关键有以下多个文件,功效以下:1用户端主框架类该类关键定义用户端界面,添加事件侦听和事件处理。该类定义了和服务器实现连接和断开连接方法。当用户登录到指定服务器上时,该类条用用户端实现消息收发类实现消息收发。同时该类定义了向全部用户发送消息方法。2用户端消息收发类该类实现了服务器和用户端消息收发3用户修改配置类该类继承自JDialog,是用户对要连接服务器IP及侦听端口进行修改配置类。4帮助类用户端用户程序帮助类2.6ActionListenerChatClient-port:publicstaticin-serverSocket:ServerSocketActionListenerChatClient-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatClient():public+init():publicvoid+Connect():publicvoid+DisConnect():publicvoid+SendMessage():publicvoidJFrameThreadClientReceiveClientReceive-socket:Socket-output:ObjectOutputStream-input:ObjectInputStream+ClientReceive(Socket,ObjectOutputStream,ObjectInJComboBox,JTextArea,JTextField) 用户端ChatClient类继承了JFrame并实现对应事件监听接口。它实现了用户端主界面及对应按钮事件侦听。该类调用ClientReceive类实现消息收发。同时该类定义了向全部用户发送消息方法。经过对应输入输出流和服务器进行数据传输和交流。关键代码实现3.1服务器关键代码实现1、Chatserver类:包含名为ChatServerpublic类,其关键功效为定义服务器端界面,添加事件侦听和事件处理。调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息收发。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;import.*;importjava.io.*;/**聊天服务端主框架类*/publicclassChatServerextendsJFrameimplementsActionListener{ publicstaticintport=8888;//服务端侦听端口 ServerSocketserverSocket;//服务端Socket Imageicon;//程序图标 JComboBoxcombobox;//选择发送消息接收者 JTextAreamessageShow;//服务端信息显示 JScrollPanemessageScrollPane;//信息显示滚动条 JTextFieldshowStatus;//显示用户连接状态 JLabelsendToLabel,messageLabel; JTextFieldsysMessage;//服务端消息发送 JButtonsysMessageButton;//服务端消息发送按钮 UserLinkListuserLinkList;//用户链表 //建立菜单栏 JMenuBarjMenuBar=newJMenuBar(); //建立菜单组 JMenuserviceMenu=newJMenu("服务(V)"); //建立菜单项 JMenuItemportItem=newJMenuItem("端口设置(P)"); JMenuItemstartItem=newJMenuItem("开启服务(S)"); JMenuItemstopItem=newJMenuItem("停止服务(T)"); JMenuItemexitItem=newJMenuItem("退出(X)"); JMenuhelpMenu=newJMenu("帮助(H)"); JMenuItemhelpItem=newJMenuItem("帮助(H)"); //建立工具栏 JToolBartoolBar=newJToolBar(); //建立工具栏中按钮组件 JButtonportSet;//开启服务端侦听 JButtonstartServer;//开启服务端侦听 JButtonstopServer;//关闭服务端侦听 JButtonexitButton;//退出按钮 //框架大小 DimensionfaceSize=newDimension(400,600); ServerListenlistenThread; JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon; /** *服务端结构函数 */ publicChatServer(){ init();//初始化程序 //添加框架关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //设置框架大小 this.setSize(faceSize); //设置运行时窗口位置 DimensionscreenSize=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)); } /** *程序初始化函数 */ publicvoidinit(){ ContainercontentPane=getContentPane(); contentPane.setLayout(newBorderLayout()); //添加菜单栏 serviceMenu.add(portItem); serviceMenu.add(startItem); serviceMenu.add(stopItem); serviceMenu.add(exitItem); jMenuBar.add(serviceMenu); helpMenu.add(helpItem); jMenuBar.add(helpMenu); setJMenuBar(jMenuBar); //初始化按钮 portSet=newJButton("端口设置"); startServer=newJButton("开启服务"); stopServer=newJButton("停止服务"); exitButton=newJButton("退出"); //将按钮添加到工具栏 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=newJComboBox(); combobox.insertItemAt("全部些人",0); combobox.setSelectedIndex(0); messageShow=newJTextArea(); messageShow.setEditable(false); //添加滚动条 messageScrollPane=newJScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(newDimension(400,400)); messageScrollPane.revalidate(); showStatus=newJTextField(35); showStatus.setEditable(false) sysMessage=newJTextField(24); sysMessage.setEnabled(false); sysMessageButton=newJButton(); sysMessageButton.setText("发送"); //添加系统消息事件侦听 sysMessage.addActionListener(this); sysMessageButton.addActionListener(this); sendToLabel=newJLabel("发送至:"); messageLabel=newJLabel("发送消息:"); downPanel=newJPanel(); girdBag=newGridBagLayout(); downPanel.setLayout(girdBag); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=0; girdBagCon.gridy=0; girdBagCon.gridwidth=3; girdBagCon.gridheight=2; girdBagCon.ipadx=5; girdBagCon.ipady=5; JLabelnone=newJLabel(""); girdBag.setConstraints(none,girdBagCon); downPanel.add(none); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=0; girdBagCon.gridy=2; girdBagCon.insets=newInsets(1,0,0,0); girdBagCon.ipadx=5; girdBagCon.ipady=5; girdBag.setConstraints(sendToLabel,girdBagCon); downPanel.add(sendToLabel); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=1; girdBagCon.gridy=2; girdBagCon.anchor=GridBagConstraints.LINE_START; girdBag.setConstraints(combobox,girdBagCon); downPanel.add(combobox); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=0; girdBagCon.gridy=3; girdBag.setConstraints(messageLabel,girdBagCon); downPanel.add(messageLabel); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=1; girdBagCon.gridy=3; girdBag.setConstraints(sysMessage,girdBagCon); downPanel.add(sysMessage); girdBagCon=newGridBagConstraints(); girdBagCon.gridx=2; girdBagCon.gridy=3; girdBag.setConstraints(sysMessageButton,girdBagCon); downPanel.add(sysMessageButton); girdBagCon=newGridBagConstraints(); 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( newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ stopService(); System.exit(0); }}}} /** *事件处理 */ 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(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); messageShow.append("服务端已经关闭\n"); combobox.removeAllItems(); combobox.addItem("全部些人"); } catch(Exceptione){ //System.out.println(e); } } /** *向全部些人发送服务器关闭消息 */ publicvoidsendStopToAll(){ intcount=userLinkList.getCount(); inti=0; while(i<count){ Nodenode=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(i<count){ Nodenode=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("");//将发送消息栏消息清空 } /** *经过给定文件名取得图像 */ ImagegetImage(Stringfilename){ URLClassLoaderurlLoader=(URLClassLoader)this.getClass(). getClassLoader(); URLurl=null; Imageimage=null; url=urlLoader.findResource(filename); image=Toolkit.getDefaultToolkit().getImage(url); MediaTrackermediatracker=newMediaTracker(this); try{ mediatracker.addImage(image,0); mediatracker.waitForID(0); } catch(InterruptedException_ex){ image=null; } if(mediatracker.isErrorID(0)){ image=null; } returnimage; } publicstaticvoidmain(String[]args){ ChatServerapp=newChatServer(); }}(2)ServerListen.java:该类实现服务端用户上线和下线侦听。该类对用户上线下线侦听是经过调用用户链表类(UserLinkList)来实现,当用户上线和下线情况发生改变时,该类会对主类界面进行对应修改。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;importjava.io.*;import.*;/**服务端侦听类*/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){ } } }}(3)ServerReceive.java:该类是实现服务器端消息收发类。该类分别定义了向某用户及全部些人发送消息方法,发送消息会显示在主界面类界面上。importjavax.swing.*;importjava.io.*;import.*;/**服务器收发消息类*/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+"下线\n"; intcount=userLinkList.getCount(); combobox.removeAllItems(); combobox.addItem("全部些人"); inti=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(Exceptione){ //System.out.println(e); } } } /* *向全部些人发送消息 */ publicvoidsendToAll(Stringmsg){ intcount=userLinkList.getCount(); inti=0; while(i<count){ Nodenode=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++; } } /* *向全部些人发送用户列表 */ publicvoidsendUserList(){ Stringuserlist=""; intcount=userLinkList.getCount(); inti=0; while(i<count){ Nodenode=userLinkList.findUser(i); if(node==null){ i++; continue; } userlist+=node.username; userlist+='\n'; i++; } i=0; while(i<count){ Nodenode=userLinkList.findUser(i); if(node==null){ i++; continue; } try{ node.output.writeObject("用户列表"); node.output.flush(); node.output.writeObject(userlist); node.output.flush(); } catch(Exceptione){ //System.out.println(e); } i++; } }}(4)Node.java:用户链表节点类,定义了链表中用户。该类和前面所讲链表节点Node类功效相当。import.*;importjava.io.*;/***用户链表结点类*/publicclassNode{ Stringusername=null; Socketsocket=null; ObjectOutputStreamoutput=null; ObjectInputStreaminput=null; Nodenext=null;}(6)UserLinkList.java:用户链表节点具体实现类。该类经过结构函数结构用户链表,定义了添加用户,删除用户、返回用户数、依据用户名查找用户、依据索引查找用户这5个方法。/***用户链表*/publicclassUserLinkList{ Noderoot; Nodepointer; intcount; /** *结构用户链表 */ publicUserLinkList(){ root=newNode(); root.next=null; pointer=null; count=0; } /** *添加用户 */ publicvoidaddUser(Noden){ pointer=root; while(pointer.next!=null){ pointer=pointer.next; } pointer.next=n; n.next=null; count++; } /** *删除用户 */ publicvoiddelUser(Noden){ pointer=root; while(pointer.next!=null){if(pointer.next==n){ pointer.next=n.next; count--; break; } pointer=pointer.next; } } /** *返回用户数 */ publicintgetCount(){ returncount; } /** *依据用户名查找用户 */ publicNodefindUser(Stringusername){ if(count==0)returnnull; pointer=root; while(pointer.next!=null){ pointer=pointer.next; if(pointer.username.equalsIgnoreCase(username)){ returnpointer; } } returnnull; } /** *依据索引查找用户 */ publicNodefindUser(intindex){ if(count==0){ returnnull; } if(index<0){ returnnull; } pointer=root; inti=0; while(i<index+1){ if(pointer.next!=null){ pointer=pointer.next; } else{ returnnull; } i++; } returnpointer; }}3.2用户端代码实现(1)ChatClient.java:包含名为ChatClientpublic类,其关键功效为定义用户端界面,添加事件侦听和事件处理。该类定义了Connect()和DisConnect()方法实现和服务器连接和断开连接。当登录到指定服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其它用户发送带有表情消息或悄悄话。//packageClient;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;import.*;/**聊天用户端主框架类*/publicclassChatClientextendsJFrameimplementsActionListener{ privatestaticfinallongserialVersionUID=1L; Stringip="";//连接到服务端ip地址 intport=8888;//连接到服务端端口号 StringuserName="急忙过客";//用户名 inttype=0;//0表示未连接,1表示已连接 JComboBoxcombobox;//选择发送消息接收者 JTextAreamessageShow;//用户端信息显示 JScrollPanemessageScrollPane;//信息显示滚动条 JLabelexpress,sendToLabel,messageLabel; JTextFieldclientMessage;//用户端消息发送 JCheckBoxcheckbox;//悄悄话 JComboBoxactionlist;//表情选择 JButtonclientMessageButton;//发送消息 JTextFieldshowStatus;//显示用户连接状态 Socketsocket; ObjectOutputStreamoutput;//网络套接字输出流 ObjectInputStreaminput;//网络套接字输入流 ClientReceiverecvThread; //建立菜单栏 JMenuBarjMenuBar=newJMenuBar(); //建立菜单组 JMenuoperateMenu=newJMenu("操作(O)"); //建立菜单项 JMenuItemloginItem=newJMenuItem("用户登录(I)",newImageIcon("face/98.gif")); JMenuItemlogoffItem=newJMenuItem("用户注销(L)",newImageIcon("face/icon.gif")); JMenuItemexitItem=newJMenuItem("退出(X)",newImageIcon("face/smile.gif")); JMenuconMenu=newJMenu("设置(C)"); JMenuItemuserItem=newJMenuItem("用户设置(U)",newImageIcon("face/messenger_big.gif")); JMenuItemconnectItem=newJMenuItem("连接设置(C)",newImageIcon("face/Uabrand.gif")); JMenuhelpMenu=newJMenu("帮助(H)"); JMenuItemhelpItem=newJMenuItem("帮助(H)",newImageIcon("face/HelpCenter.gif")); //建立工具栏 JToolBartoolBar=newJToolBar(); //建立工具栏中按钮组件 JButtonloginButton;//用户登录 JButtonlogoffButton;//用户注销 JButtonuserButton;//用户信息设置 JButtonconnectButton;//连接设置 JButtonexitButton;//退出按钮 //框架大小 DimensionfaceSize=newDimension(400,600); JPaneldownPanel; GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon; publicChatClient(){ init();//初始化程序 //添加框架关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //设置框架大小 this.setSize(faceSize); this.setVisible(true); setIconImage(getToolkit().getImage("face/love.gif")); //设置运行时窗口位置 DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-faceSize.getWidth())/2, (int)(screenSize.height-faceSize.getHeight())/2); this.setResizable(false); this.setTitle("聊天室用户端");//设置标题 //为操作菜单栏设置热键'V' operateMenu.setMnemonic('O'); //为用户登录设置快捷键为ctrl+i loginItem.setMnemonic('I'); loginItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,InputEvent.CTRL_MASK)); //为用户注销快捷键为ctrl+l logoffItem.setMnemonic('L'); logoffItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK)); //为退出快捷键为ctrl+x exitItem.setMnemonic('X'); exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK)); //为设置菜单栏设置热键'C' conMenu.setMnemonic('C'); //为用户设置设置快捷键为ctrl+u userItem.setMnemonic('U'); userItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK)); //为连接设置设置快捷键为ctrl+c connectItem.setMnemonic('C'); connectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK)); //为帮助菜单栏设置热键'H' helpMenu.setMnemonic('H'); //为帮助设置快捷键为ctrl+p helpItem.setMnemonic('H'); helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK)); } /** *程序初始化函数 */ publicvoidinit(){ ContainercontentPane=getContentPane(); contentPane.setLayout(newBorderLayout()); //添加菜单栏 operateMenu.add(loginItem); operateMenu.add(logoffItem); operateMenu.addSeparator(); operateMenu.add(exitItem); jMenuBar.add(operateMenu); conMenu.add(userItem); conMenu.addSeparator(); conMenu.add(connectItem); jMenuBar.add(conMenu); helpMenu.add(helpItem); jMenuBar.add(helpMenu); setJMenuBar(jMenuBar); //初始化按钮 loginButton=newJButton("登录"); logoffButton=newJButton("注销"); userButton=newJButton("用户设置"); connectButton=newJButton("连接设置"); exitButton=newJButton("退出"); //当鼠标放上显示信息 loginButton.setToolTipText("连接到指定服务器"); logoffButton.setToolTipText("和服务器断开连接"); userButton.setToolTipText("设置用户信息"); connectButton.setToolTipText("设置所要连接到服务器信息"); //将按钮添加到工具栏 toolBar.add(userButton); toolBar.add(connectButton); toolBar.addSeparator();//添加分隔栏 toolBar.add(loginButton); toolBar.add(logoffButton); toolBar.addSeparator();//添加分隔栏 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); checkbox=newJCheckBox("悄悄话"); checkbox.setSelected(false); actionlist=newJComboBox(); actionlist.addItem("微笑地"); actionlist.addItem("快乐地"); actionlist.addItem("轻轻地"); actionlist.addItem("生气地"); actionlist.setSelectedIndex(0); //初始时 loginButton.setEnabled(true); logoffButton.setEnabled(false); //为菜单栏添加事件监听 loginItem.addActionListener(this); logoffItem.addActionListener(this); exitItem.addActionListener(this); userItem.addActionListener(this); connectItem.addActionListener(this); helpItem.addActionListener(this); //添加按钮事件侦听 loginButton.addActionListener(this); logoffButton.addActionListener(this); userButton.addActionListener(this); connectButton.addActionListener(this); exitButton.addActionListener(this); combobox=newJComboBox(); c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论