网络应用开发综合实践《java聊天系统》_第1页
网络应用开发综合实践《java聊天系统》_第2页
网络应用开发综合实践《java聊天系统》_第3页
网络应用开发综合实践《java聊天系统》_第4页
网络应用开发综合实践《java聊天系统》_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

个人资料整理 仅限学习使用学院网络工程系网络应用开发综合实践》——基于TCP的java及时聊天系统设计报告姓名:XXXXXXXX学号:XXXXXXXXXXXX班级:XXXXXXXXX指导老师: XXXXX完成时间: XXXXXXX基于TCP的java及时聊天系统摘要TCP/IP网络体系结构和协议标准是近年来计算机网络研究和应用的热点技术 ,以它为基础组建的INTERNET已成为目前国际上规模最大的计算机网络系统。在我国,TCP/IP也越来越受到广泛关注,并得以多层次推广。在TCP/IP的模型中,传输层有两个并列的协议:TCP(TransportControlProtocol, 传输控制协议>和UDP(UserDatagramProtocol,用户数据报协议>。TCP和UDP共存于一个网络中,TCP是面向连接的,提供可靠性服务,UDP是无连接的,提供高效率服务。高可靠性的TCP通常用于一次传输要交换大量报文的情形,比如文件传输、远程登录等。高效率的UDP一般用于一次传输交换少量报文,尤其是交易型应用,比如数据库查询的情形,其可靠性由应用程序提供,因为交换次数不多,即便发生传输错误,必须重传,应用程序也不会为此付出太大的代价。b5E2RGbCAP在网络越来越发达的今天,人们对网络的依赖越来越多 ,越来越离不开网络,由此而产生的聊天工具越来越多,网络聊天时一类的聊天系统的发展日新月异。本java及时聊天系统即是一个使用套接字<socket)实现C/S<clientandserver)模式的TCP/IP协议下连接的及时通信系统。p1EanqFDPw1/33个人资料整理 仅限学习使用本论文主要分为六章:第一章引言,介绍本java及时聊天系统的需求分析,阐述了工程的开发背景、系统设计方法,明确了该设计的主要任务。第二章是系统的概要设计,详细描述了聊天系统的运行环境,系统的结构设计以及设计实现的基本功能。第三章描述了使用MyEclipse完成系统架构设计,实现简便切逻辑化的程序设计。第四章是系统的详细设计,详细介绍了系统的结构以及各个功能模块的设计细节。第五章是对本java及时聊天系统的测试结果报告,主要针对系统各功能模块进行细节测试。最后是本次网络应用开发综合实践的总结及体会。 DXDiTa9E3d关键词:java;TCP/IP;C/S;MyEclipse;及时通信abstractTCP/IPnetworksystemstructureandprotocolstandardsinrecentyearsistostudyandapplicationofcomputernetworkbyitshotspottechnologiesbasedINTERNEThasbecomeacurrentinternational'slargestcomputernetworksystem.Inourcountry,theTCP/IPisalsomoreandmoreattention,andtomulti-levelpromotion.OnTCP/IPmodel,theTransportlayerhastwoparatacticagreement:TransportControlProtocol(TCP,TCPandUDP(UserDatagram>Protocol,UserdatareportedProtocol>.TCPandUDPcoexistinanetwork,theTCPisconnection-oriented,providereliabilityservice,UDPisnoconnection,withefficientservice.HighreliabilityoftheTCPnormallyusedforatransmissionofmessagestoexchangethesituation,suchasfiletransfer,remotelogin,etc.。EfficientUDPgeneralforatransmissionmessage,especiallyforsmallamounts,suchastransactionaldatabasequeryapplicationsituation,itsreliabilitybyapplicationsprovide,becausefew,evenhappenexchangefrequencytransmissionerror,necessitatingretransmission,applicationsalsowon'tpaythetoobigpriceRTCrpUDGiT.Innetworkismoreandmoredevelopedtoday,peopledependingontheInternet,moreandmoretiedtotheInternet,whichproducesmorechattingtools,onlinechatchattingsystemwhenthedevelopmentofaday.TheJavatimelychatsystemisausesocket(socket>toimplementC/S(andserver>modeareundertheTCP/IPprotocolconnecttimelycommunicationsystem.5PCzVD7HxAThisthesismainlydividedintosixchapters:thefirstchapterpreface,introducetheJavachatsystemtimelyrequirementanalysis,expoundsthedevelopmentbackground,systemprojectdesignmethods,clearthedesignofthemaintask.Thesecondchapterissystem2/33个人资料整理 仅限学习使用ofgeneraldesign,describesthedetailedchattheoperationofthesystemenvironment,systemdesignandimplementationofstructuraldesignandbasicfunction.ThethirdchapterdescribesMyEclipsecompleteuseofsystemarchitecturedesign,realizationofsimplecutlogicprogramming.Thefourthchapterissystemofthedetaileddesign,detailedintroductionofsystemstructureandmodulesdesigndetails.ThefifthchapterisillustrativeoftheJavatimelychatsystemstestresultsreport,thefunctionmodulemainlyaimedatthesystemdetailtest.ThelastisthenetworkapplicationdevelopmentandcomprehensivethesummaryofpracticeandexperiencejLBHrnAILg.Keywords:Java。TCP/IP。C/S。MyEclipse。TimelycommunicationxHAQX74J0X目 录摘要1LDAYtRyKfEabstract 2Zzz6ZB2Ltk一. 引言4dvzfvkwMI11.1背景4rqyn14ZNXI1.2需求分析4EmxvxOtOco二.系统设计5SixE2yXPq52.1功能概述56ewMyirQFL2.2运行环境5kavU42VRUs三.2.3系统结构5y6v3ALoS89系统架构设计6M2ub6vSTnP3.1整体设计60YujCfmUCw3.2服务器端设计6eUts8ZQVRd3.3客户端设计6sQsAEJkW5T四.详细设计7GMsIasNXkA4.1聊天室服务器端设计7TIrRGchYzg4.1.1server.java77EqZcWLZNX4.1.2ServerListen.java12lzq7IGf02E4.1.3ServerReceive.java14zvpgeqJ1hk4.1.4PorConf.java16NrpoJac3v14.1.5Node.java181nowfTG4KI4.1.6UserLinkList.java18fjnFLDa5Zo4.1.7Help.java20tfnNhnE6e54.2聊天室客户端设计21HbmVN777sL4.2.1client.java21V7l4jRB8Hs4.2.2ClientReceive.java2683lcPA59W94.2.3ConnectConf.java27mZkklkzaaP4.2.4UserConf.java28AVktR43bpw五.测试报告29ORjBnOwcEd5.1系统界面预览302MiJTy0dTT5.2测试过程30gIiSpiue7A5.2.1服务器端端口设置及侦听功能30uEh0U1Yfmh5.2.2客户端连接功能30IAg9qLsgBX5.2.2用户信息设置功能30WwghWvVhPE3/33个人资料整理 仅限学习使用5.2.3 用户登录/注销功能 30asfpsfpi4k5.2.4 聊天通信功能 31ooeyYZTjj15.2.5 帮助服务功能 32BkeGuInkxI六.总结及体会 32PgdO0sRlMo七.参考文献 333cdXwckm15一.引言1.1背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似飞鸽等一类的聊天、文件传送系统的发展日新月异,应2018——2018学年第二学期《网络应用开发综合实践》课程要求,我选择制作一个局域网的网络聊天工具作为本次的综合实践课程;以求通过制作该系统能更好的学习网络编程及应用开发。h8c52WOngM本次选题为“基于 TCP的java聊天系统”的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由 IP地址可以唯一地确定 Internet上的一台主机。而 TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。目前较为流行的网络编程模型是客户机/服务器<C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。v4bdyGious1.2需求分析本基于TCP的java聊天系统具体目的是通过网络协议与其他计算机进行通讯。主要实现如下需求目的:登录 /注销、实时聊天、状态显示、帮助操作等。J0bm4qMpJ9作为当今最流行的及时通信工具,腾讯 QQ、MSN等软件具有强大的聊天、文件传输、图片保存、远程协助等功能,在日常的生活工作中对人与人之间通信帮助巨大,在一定程度上甚至已经取代传统的信件通信。本次的网络应用开发综合实践我4/33个人资料整理 仅限学习使用就是以通信中最基本的聊天消息收发方式设计一个基于TCP的java及时聊天系统,由于能力有限,所以把一些要求较高的功能删除了,只留下了聊天这一简单的通信功能。此简单及时聊天通信系统通过java语言编写,提供给用户基本的纯文本消息收发功能,能够通过C/S结构实现消息的转发和接收。XVauA9grYP二.系统设计2.1功能概述本java即时聊天系统是一个基于TCP的、由java语言编写的典型应用程序,它运用目前较为流行的网络编程模型是客户机/服务器<C/S)结构,实现通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务,其系统主要功能概述如下:bR9C6TJscw(1>登录/注销功能:在服务器端启动服务开始侦听后,客户端可以登录聊天系统进行及时聊天;或者结束聊天注销登录。pN9LBDdtrd(2>聊天功能:客户可以通过服务器转发消息 ,实现一对一和多对多聊天。(3>设置功能:客户端可以在登录前进行基本信息设置功能。(4>显示功能:客户端程序应该可以实时显示目前所有客户端用户的状态。2.2运行环境硬件:PC机操作系统:Windows2003/XP/Vista/7编译环境:MyEclipse8.5+Tomcat6.0开发工具:MyEclipse8.5+Tomcat6.0编程语言:java2.3系统结构Java聊天系统服务器端 客户端图2.3系统结构端启停用用用注用口动止户私群户户销户私群设服服显聊聊5/33设登登显聊聊示置务务示置录录个人资料整理 仅限学习使用三.系统架构设计3.1整体设计本java聊天系统在MyEclipse8.5设计时严格按照C/S结构设计,客户端“client”及服务器端“server”分别实现需求分析中的目的,具体整体设计结构如下图所示:DJ8T7nHuGT图3.1 系统整体架构设计3.2服务器端设计JFrame ActionListener ThreadChatServerServerListen-port:publicstaticin-server:ServerSocket-serverSocket:ServerSocket-userLinkList:UserLinkList-messageShow:JTextArea-isStop:publicBoolean-userLinkList:UserLinkList图3.2服+ServerListen(ServerSocket,JComboBox,J-showStatus:JTextFieldTextArea,JTextField,UserLinkList>+ChatServer(>:public务器端设ServerReceive+init(>:publicvoid计-textarea:JTextArea+startService(>:publicvoid-userLinkList:UserLinkList+stopService(>:publicvoid3.3客-isStop:publicBoolean+sendStopToAll(>:publicvoid+ServerListen(ServerSocket,JComboBox,J+sendMsgToAll(String>:publicvoid户端设TextArea,JTextField,UserLinkList>+sendSystemMessage(>:publicvoid6/33个人资料整理 仅限学习使用计JFrame ActionListener ThreadChatClientClientReceive-port:publicstaticin图3.2-socket:Socket-serverSocket:ServerSocket客-messageShow:JTextArea户器端设-output:ObjectOutputStream-userLinkList:UserLinkList-input:ObjectInputStream-showStatus:JTextField计+ClientReceive(Socket,ObjectOutputStrea+ChatClient(>:publicm,ObjectInputStream,JComboBox,JTextA+init(>:publicvoid四.详rea,JTextField>+Connect(>:publicvoid细设计+DisConnect(>:publicvoid+SendMessage(>:publicvoid本基于TCP的java及时聊天系统一共包含2个部分:server部分和client部分,分别实现服务器端功能和客户端功能。QF81D7bvUA4.1聊天室服务器端设计聊天室服务端主要包括 7个文件,它们的功能如下:4.1.1server.javaserver.java 包含名为server的public 类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用 ServerListen 类来实现服务端用户上线与下线的侦听,调用 ServerReceive类来实现服务器端的消息的收发。主要实现方法源代码如下:4B7a9QFw9hpackageserver。importjava.awt.*。importjava.awt.event.*。importjavax.swing.*。importjavax.swing.event.*。.*。importjava.io.*。/**聊天服务端的主框架类*/publicclassserverextendsJFrameimplementsActionListener{ix6iFA8xoXpublicstaticintport=8888。//服务端的侦听端口ServerSocketserverSocket。//服务端SocketImageicon。//程序图标JComboBoxcombobox。//选择发送消息的接受者7/33个人资料整理 仅限学习使用JTextAreamessageShow。//服务端的信息显示JScrollPanemessageScrollPane。//信息显示的滚动条JTextFieldshowStatus。//显示用户连接状态JLabelsendToLabel,messageLabel。JTextFieldsysMessage。//服务端消息的发送JButtonsysMessageButton。//服务端消息的发送按钮UserLinkListuserLinkList。//用户链表// 建立菜单栏JMenuBar jMenuBar = newJMenuBar(> 。建立菜单组JMenu serviceMenu = newJMenu( "服务(V>" >。//建立菜单项JMenuItemportItem=newJMenuItem("端口设置(P>">。JMenuItemstartItem=newJMenuItem("启动服务(S>">。JMenuItemstopItem=newJMenuItem("停止服务(T>">。JMenuItemexitItem=newJMenuItem("退出(X>">。JMenuhelpMenu=newJMenu("帮助(H>">。JMenuItemhelpItem=newJMenuItem("帮助(H>">。//建立工具栏JToolBar toolBar = newJToolBar(> 。建立工具栏中的按钮组件框架的大小/**服务端构造函数*/public server(>{添加框架的关闭事件处理this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE>。wt6qbkCyDEthis.pack(>。设置框架的大小this .setSize( faceSize >。设置运行时窗口的位置this.setTitle("聊天室服务端">。//设置标题/**}*程序初始化函数*/publicvoidinit(>{ContainercontentPane=getContentPane(>。contentPane.setLayout(newBorderLayout(>>。添加菜单栏初始化按钮将按钮添加到工具栏8/33个人资料整理 仅限学习使用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>sysMessage.addActionListener(this>sysMessageButton.addActionListener(this>sendToLabel=newJLabel(":">messageLabel=newJLabel(":">downPanel=newJPanel(>girdBag=newGridBagLayout(>downPanel.setLayout(girdBag>girdBagCon=newGridBagConstraints(>JLabelnone=newJLabel("">girdBagCon=newGridBagConstraints(>girdBagCon=newGridBagConstraints(>girdBagCon=newGridBagConstraints(>girdBagCon=newGridBagConstraints(>girdBagCon=newGridBagConstraints(>girdBagCon=newGridBagConstraints(>this .addWindowListener(newWindowAdapter(>{publicvoid windowClosing(WindowEvente>{9/33个人资料整理 仅限学习使用stopService(> 。System. exit (0>。}}。}/**事件处理*/publicvoidactionPerformed(ActionEvente>{Objectobj=e.getSource(>。if(obj==startServer||obj==startItem>{//启动服务端Kp5zH46zRkstartService(>。}elseif(obj==stopServer||obj==stopItem>{//停止服务端Yl4HdOAA61}elseif(obj==portSet||obj==portItem>{//端口设置ch4PJx4BlI调出端口设置的对话框PortConfportConf= newPortConf( this >。portConf.show(> 。}elseif (obj== exitButton ||obj== exitItem >{ // 退出程序qd3YfhxCzo}elseif (obj== helpItem >{ // 菜单栏中的帮助调出帮助对话框HelphelpDialog=newHelp(this>。helpDialog.show(>。}elseif(obj==sysMessage||obj==sysMessageButton>{//发送系统消息E836L11DO5sendSystemMessage(>。}/**}启动服务端*/publicvoid startService(>{try {serverSocket = newServerSocket( port ,10> 。messageShow .append( "服务端已经启动,在 "+port +"端口侦听...\n" >。}catch (Exceptione>{//System.out.println(e> 。}userLinkList = newUserLinkList(> 。listenThread = newServerListen( serverSocket ,combobox ,messageShow ,showStatus ,userLinkList >。S42ehLvE3MlistenThread .start(> 。10/33个人资料整理 仅限学习使用}/*** 关闭服务端*/publicvoid stopService(>{try {向所有人发送服务器关闭的消息}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{}11/33个人资料整理 仅限学习使用node. output .writeObject( "系统信息">。node. output .flush(> 。node. output .writeObject(msg> 。node. output .flush(> 。}catch (Exceptione>{//System.out.println("@@@"+e> 。}i++ 。}sysMessage .setText( "">。}/*** 向客户端用户发送消息*/publicvoid sendSystemMessage(>{StringtoSomebody= combobox .getSelectedItem(>.toString(> 。501nNvZFisStringmessage= sysMessage .getText(>+ "\n" 。messageShow .append(message> 。向所有人发送消息if(toSomebody.equalsIgnoreCase("所有人">>{sendMsgToAll(message>。}else{//向某个用户发送消息try{Nodenode=userLinkList.findUser(toSomebody>。node.output.writeObject("系统信息">。node.output.flush(>。node.output.writeObject(message>。node.output.flush(>。}catch(Exceptione>{//System.out.println("!!!"+e>。}sysMessage.setText("">。//将发送消息栏的消息清空}}publicstaticvoidmain(String[]args>{}serverapp=newserver(>。}4.1.2ServerListen.java该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类<UserLinkList )来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。主要实现方法源代码如下: jW1viftGw9publicclass ServerListen extends Thread{12/33个人资料整理 仅限学习使用ServerSocket server 。JComboBox combobox 。JTextArea textarea 。JTextField textfield 。UserLinkList userLinkList 。// 用户链表Node client 。ServerReceive recvThread 。publicboolean isStop 。/**聊天服务端的用户上线于下线侦听类*/publicServerListen(ServerSocketserver,JComboBoxcombobox,xS0DOYWHLPJTextAreatextarea,JTextFieldtextfield,UserLinkListuserLinkList>{LOZMkIqI0wthis.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(>>。ZKZUQsUJedclient.output.flush(>。client.input=newObjectInputStream(client.socket.getInputStream(>>。dGY2mcoKtTclient.username=(String>client.input.readObject(>。rCYbSWRLIA显示提示信息combobox.addItem(client.username>。userLinkList.addUser(client>。textarea.append("用户"+client.username+"上线"+"\n">。FyXjoFlMWhtextfield.setText("在线用户"+userLinkList.getCount(>+"人\n">。TuWrUpPObXrecvThread=newServerReceive(textarea,textfield,combobox,client,userLinkList>。recvThread.start(>。catch(Exceptione>{}}}}}13/33个人资料整理 仅限学习使用4.1.3ServerReceive.java该类是实现服务器端的消息的收发的类。该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。主要实现方法源代码如下:7qWAq9jPqE/**服务器收发消息的类*/publicclass ServerReceive extends Thread{JTextArea textarea 。JTextField textfield 。JComboBox combobox 。Node client 。UserLinkListuserLinkList。//用户链表publicbooleanisStop。publicServerReceive(JTextAreatextarea,JTextFieldtextfield,JComboBoxcombobox,Nodeclient,UserLinkListuserLinkList>{yhUQsDgRT1this.textarea=textarea。this.textfield=textfield。this.client=client。this.userLinkList=userLinkLbobox=combobox。isStop=false。}publicvoidrun(>{向所有人发送用户的列表sendUserList(>。while(!isStop&&!client.socket.isClosed(>>{try{Stringtype=(String>client.input.readObject(>。if(type.equalsIgnoreCase("聊天信息">>{StringtoSomebody=(String>client.input.readObject(>。MdUZYnKS8IStringstatus=(String>client.input.readObject(>。09T7t6eTnoStringaction=(String>client.input.readObject(>。e5TfZQIUB5Stringmessage=(String>client.input.readObject(>。s1SovAcVQMStringmsg=client.username+""+action+"对"+toSomebody+"说:"+message+"\n"。if(status.equalsIgnoreCase("悄悄话">>{msg="[悄悄话]"+msg

llVIWTNQFk。14/33个人资料整理 仅限学习使用}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>。GXRw1kFW5suserLinkList.delUser(node>。Stringmsg="用户"+client.username+"下线\n"。intcount=userLinkList.getCount(>。combobox.removeAllItems(>。combobox.addItem("所有人">。inti=0。while(i<count>{if(node==null>{node=userLinkList.findUser(i>。i++。continue。}combobox.addItem(node.username>。}i++。combobox.setSelectedIndex(0>。textarea.append(msg>。textfield.setText("在线用户"+userLinkList.getCount(>+"人\n">。UTREx49Xj9sendToAll(msg>。//向所有人发送消息sendUserList(>。//重新发送用户列表,刷新break。15/33个人资料整理 仅限学习使用}}catch (Exceptione>{//System.out.println(e> 。}}}/**向所有人发送消息*//**向所有人发送用户的列表*/}4.1.4PorConf.java该类继承自 JDialog,是用户对服务器端侦听端口进行修改配置的类。主要实现方法源代码如下:/**生成端口设置对话框的类*/publicclassPortConfextendsJDialog{JPanelpanelPort=newJPanel(>。JButtonsave=newJButton(>。JButtoncancel=newJButton(>。publicstaticJLabelDLGINFO=newJLabel("默认端口号为:8888">。8PQN3NDYyPJPanelpanelSave=newJPanel(>。JLabelmessage=newJLabel(>。publicstaticJTextFieldportNumber。publicPortConf(JFrameframe>{super(frame,true>。try{}jbInit(>。catch(Exceptione>{}e.printStackTrace(>。设置运行位置,使对话框居中}privatevoidjbInit(>throwsException{this.setSize(newDimension(300,120>>。this.setTitle("端口设置">。message.setText("请输入侦听的端口号:">。portNumber=newJTextField(10>。portNumber.setText(""+server.port>。save.setText("保存">。cancel.setText("取消">。16/33个人资料整理 仅限学习使用panelPort.setLayout(newFlowLayout(>>。panelPort.add(message>。panelPort.add(portNumber>。panelSave.add(newLabel("">>。panelSave.add(save>。panelSave.add(cancel>。panelSave.add(newLabel("">>。ContainercontentPane=getContentPane(>。contentPane.setLayout(newBorderLayout(>>。contentPane.add(panelPort,BorderLayout.NORTH>。contentPane.add(DLGINFO,BorderLayout.CENTER>。contentPane.add(panelSave,BorderLayout.SOUTH>。保存按钮的事件处理save.addActionListener(newActionListener(>{publicvoidactionPerformed(ActionEventa>{intsavePort。try{savePort=Integer.parseInt(PortConf.portNumber.getText(>>。mLPVzx7ZNwif(savePort<1||savePort>65535>{PortConf.DLGINFO.setText("侦听端口必须是0-65535之间的整数!">。PortConf.portNumber.setText("">。return。}server.port=savePort。}dispose(>。catch(NumberFormatExceptione>{PortConf.DLGINFO.setText("错误的端口号,端口号请填写整数!">。PortConf.portNumber.setText("">。return。}}}。关闭对话框时的操作this.addWindowListener(newWindowAdapter(>{publicvoid windowClosing(WindowEvente>{DLGINFO.setText( "默认端口号为 :8888" >。}}。取消按钮的事件处理cancel.addActionListener(newActionListener(>{publicvoid actionPerformed(ActionEvente>{17/33个人资料整理 仅限学习使用DLGINFO.setText( "默认端口号为 :8888" >。dispose(> 。}}>。}}4.1.5Node.java用户链表节点类,定义了链表中的用户。主要实现方法源代码如下:/**用户链表的结点类*/publicclass Node{String username = null 。Socket socket = null 。ObjectOutputStream output = null 。ObjectInputStream input = null 。Node next = null 。}4.1.6UserLinkList.java用户链表节点的具体实现类,通过构造函数构造用户链表,定义了“添加用户”、“删除用户”、“返回用户数”、“根据用户名查找用户”、“根据索引查找用户”这5个方法。主要实现方法源代码如下: AHP35hB02d/**用户链表*/publicclass UserLinkList{Node root 。Node pointer 。int count 。/**构造用户链表*/public UserLinkList(>{root = newNode(> 。root .next = null 。pointer = null 。count =0 。}/**添加用户*/publicvoid addUser(Noden>{pointer = root 。while (pointer .next != null >{pointer = pointer .next 。}18/33个人资料整理 仅限学习使用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。}}/**返回用户数*/publicint getCount(>{return count 。}/**根据用户名查找用户*/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=i=0。while(i<index+1>{if(pointer.next!=null>{pointer=pointer.next。19/33个人资料整理 仅限学习使用}else {returnnull 。}i++。}return pointer 。}}4.1.7Help.java服务器端程序帮助类。主要实现方法源代码如下:/**生成设置对话框的类*/publicclass Helpextends JDialog{JPanel titlePanel = newJPanel(> 。JPanel contentPanel = newJPanel(> 。JPanel closePanel = newJPanel(> 。JButton close = newJButton(> 。JLabel title = newJLabel( "聊天室服务端帮助 ">。JTextArea help = newJTextArea(> 。Color bg= newColor(255,255,255> 。public Help(JFrameframe>{super (frame, true >。try {jbInit(> 。}catch (Exceptione>{e.printStackTrace(> 。}设置运行位置,使对话框居中}privatevoidjbInit(>throwsException{this.setSize(newDimension(400,200>>。this.setTitle("帮助">。titlePanel.setBackground(bg>。。contentPanel.setBackground(bg>。closePanel.setBackground(bg>。help.setText("">。事件处理close .addActionListener(newActionListener(>{publicvoid actionPerformed(ActionEvente>{dispose(> 。}}>。}}20/33个人资料整理 仅限学习使用4.2聊天室客户端设计聊天室服务端主要包括5个文件,其中Help.java类与服务器端的Help.java类作用相同,在这里就不再重复阐述,其余4个的功能如下:NDOcB141gT4.2.1client.java包含名为client的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了 Connect(>与DisConnect(>方法实现与服务器的连接与断开连接。当登录到指定的服务器时,调用 ClientReceive类实现消息收发,同时该类还定义了SendMessage(>方法来向其他用户发送带有表情的消息或者悄悄话。主要实现方法源代码如下:1zOk7Ly2vApackageclient。importjava.awt.*。importjava.awt.event.*。importjavax.swing.*。importjava.io.*。.*。/**聊天客户端的主框架类*/publicclassclientextendsJFrameimplementsActionListener{fuNsDv23KhprivatestaticfinallongserialVersionUID=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。建立菜单栏JMenuBar jMenuBar = newJMenuBar(> 。建立菜单组JMenu operateMenu = newJMenu( "操作(O>">。建立菜单项21/33个人资料整理 仅限学习使用建立工具栏JToolBar toolBar = newJToolBar(> 。建立工具栏中的按钮组件框架的大小public client(>{init(> 。// 初始化程序添加框架的关闭事件处理this .setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE>。tqMB9ew4YXthis .pack(> 。设置框架的大小this .setSize( faceSize >。this .setVisible( true >。setIconImage(getToolkit(>.getImage( "face/love.gif" >>。HmMJFY05dE设置运行时窗口的位置this .setTitle( "聊天室客户端 ">。 // 设置标题}/**程序初始化函数*/publicvoid init(>{ContainercontentPane=getContentPane(> 。contentPane.setLayout( newBorderLayout(>> 。添加菜单栏初始化按钮当鼠标放上显示信息loginButton .setToolTipText( "连接到指定的服务器 ">。logoffButton .setToolTipText( "与服务器断开连接 ">。userButton .setToolTipText( "设置用户信息 ">。connectButton .setToolTipText( "设置所要连接到的服务器信息 ">。将按钮添加到工具栏初始时loginButton .setEnabled( true >。logoffButton .setEnabled( false >。为菜单栏添加事件监听添加按钮的事件侦听添加滚动条添加系统消息的事件侦听关闭程序时的操作22/33个人资料整理 仅限学习使用this .addWindowListener(newWindowAdapter(>{publicvoid windowClosing(WindowEvente>{if (type ==1>{DisConnect(> 。}System. exit (0>。}}>。}/**事件处理*/publicvoid actionPerformed(ActionEvente>{Objectobj=e.getSource(> 。if (obj== userItem ||obj== userButton >{ // 用户信息设置 ViLRaIt6sk调出用户信息设置对话框UserConfuserConf= newUserConf( this ,userName >。userConf.setVisible( true >。userName =userConf. userInputName 。}elseif (obj== connectItem ||obj== connectButton >{ // 连接服务端设置9eK0GsX7H1调出连接设置对话框naK8ccr8VIConnectConfconConf=newConnectConf(this,ip,port>。conConf.setVisible(true>。ip=conConf.userInputIp。port=conConf.userInputPort。}elseif(obj==loginItem||obj==loginButton>{//登录B6JgIVV9aoConnect(>。}elseif(obj==logoffItem||obj==logoffButton>{//注销P2IpeFpap5DisConnect(>。showStatus.setText("">。}elseif(obj==clientMessage||obj==clientMessageButton>{//发送消息3YIxKpScDMSendMessage(>。clientMessage.setText("">。}elseif(obj==exitButton||obj==exitItem>{//退出gUHFg9mdSsintj=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE>。uQHOMTQe79if(j==JOptionPane.YES_OPTION>{if(type==1>{DisConnect(> 。}System. exit (0>。}23/33个人资料整理 仅限学习使用}elseif (obj== helpItem >{ // 菜单栏中的帮助调出帮助对话框HelphelpDialog=newHelp(this>。}helpDialog.setVisible(true>。}publicvoidConnect(>{try{socket=newSocket(ip,port>。}catch(Exceptione>{JOptionPane.showConfirmDialog(this,"不能连接到指定的服务器。\n请确认连接设置是否正确。","提示",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE>。IMGWiDkflPreturn。}try{output=newObjectOutputStream(socket.getOutputStream(>>。WHF4OmOgAwoutput.flush(>。input=newObjectInputStream(socket.getInputStream(>>。aDFdk6hhPdoutput.writeObject(userName>。output.flush(>。recvThread=newClientReceive(socket,output,input,combobox,messageShow,showStatus>。ozElQQLi4TrecvThread.start(>。loginButton.setEnabled(false>。loginItem.setEnabled(false>。userButton.setEnabled(false>。userItem.setEnabled(false>。connectButton.setEnabled(false>。connectItem.setEnabled(false>。logoffButton.setEnabled(true>。logoffItem.setEnabled(true>。clientMessage.setEnabled(true>。messageShow.append("连接服务器"+ip+":"+port+"成功...\n">。CvDtmAfjiAtype=1。//标志位设为已连接}catch(Exceptione>{System.out.println(e>。return。}}publicvoidDisConnect(>{loginButton.setEnabled(true>。loginItem.setEnabled(true>。userButton.setEnabled(true>。userItem.setEnabled(true>。connectButton.setEnabled(true>。connectItem.setEnabled(true>。24/33个人资料整理 仅限学习使用logoffButton.setEnabled(false>。logoffItem.setEnabled(false>。clientMessage.setEnabled(false>。if(socket.isClosed(>>{return。}try{output.writeObject("用户下线">。output.flush(>。input.close(>。output.close(>。socket.close(>。messageShow.append("已经与服务器断开连接...\n">。type=0。//标志位设为未连接}catch(Exceptione>{//}}publicvoidSendMessage(>{QrDCRkJkxhStringtoSomebody=combobox.getSelectedItem(>.toString(>。Stringstatus=""。if(checkbox.isSelected(>>{status="悄悄话"。}Iconface=newImageIcon("face/smile.gif">。4nCKn3dlMXStringaction=actionlist.getSelectedItem(>.toString(>。Stringmessage=clientMessage.getText(>。if(socket.isClosed(>>{return。try{}output.writeObject("聊天信息">。output.flush(>。output.writeObject(toSomebody>。output.flush(>。output.writeObject(action>。output.flush(>。output.writeObject(action>。output.flush(>。output.writeObject(message>。output.flush(>。}catch(Exceptione>{//}}publicstaticvoidmain(String[]args>{newclient(>。}}25/33个人资料整理 仅限学习使用4.2.2ClientReceive.java该类是实现服务器端与客户端消息收发的类。主要实现方法源代码如下 :/**聊天客户端消息收发类*/publicclass ClientReceive extends Thread{private JComboBox combobox 。private JTextArea textarea 。Socket socket 。ObjectOutputStream output 。ObjectInputStream input 。JTextField showStatus 。publicClientReceive(Socketsocket,ObjectOutputStreamoutput,ijCSTNGm0EObjectInputStreaminput,JComboBoxcombobox,JTextAreatextarea,JTextFieldshowStatus>{vfB1pxanfkthis.socket=socket。this.output=output。this.input=bobox=combobox。this.textarea=textarea。this.showStatus=showStatus。}publicvoid run(>{while (!socket .isClosed(>>{try {Stringtype=(String>input.readObject(>。if(type.equalsIgnoreCase("系统信息">>{Stringsysmsg=(String>input.readObject(>。textarea.append("系统信息:"+sysmsg>。}elseif(type.equalsIgnoreCase("服务关闭">>{output.close(>。input.close(>。socket.close(>。textarea.append("服务器已关闭!\n">。break。}elseif(type.equalsIgnoreCase("聊天信息">>{Stringmessage=(String>input.readObject(>。textarea.append(mes

温馨提示

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

评论

0/150

提交评论