软件工程设计说明_第1页
软件工程设计说明_第2页
软件工程设计说明_第3页
软件工程设计说明_第4页
软件工程设计说明_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

软件工程课程设计报告题目:聊天软件的设计与开发一、课程设计概述1.1.目的此次课程设计的目标是用JAVA语言实现一个功能比较完善的聊天软件,在设计该软件的过程中,结合软件工程课堂上所学的软件开发方法和知识,使系统具有注册、登入、退出功能。具有群聊、私聊功能,能够显示在线好友,消息提醒等功能。1.2.任务通过认真阅读老师所给的课程设计的题目要求,进行系统的需求分析和系统的开发与设计。1.3.开发环境:运行环境:Windows9x、2000、xp、2003,Linux必要环境:JDK1.5以上硬件环境:CPU400MHz以上,内存64MB以上1.4.参考资料:[1].钱永秋等,软件工程,清华大学出版社,2007年3月。[2].谭浩强等,Java语言程序设计,中国铁路出版社,2004年12月。1.5组长马凤丽:负责服务器端的监控,以及与客户端的联系。

组员蒋绍杰:负责客户端用户的注册、登录和聊天室主页面。二、项目的需求分析过程及需求模型2.1.系统可行性分析计算机网络的迅速发展,对人类社会诸多领域产生了巨大的影响。尤其是,随着信息时代的来临,人们之间愈来愈趋向于通过网络来交流和传递信息。而聊天系统正是当前人们使用最多的中介。在这个平台上,许多认识或不认识的人们彼此间能够随意的相互交流。因此,开发和架构这种平台符合时代发展的需要。本系统在开发中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。2.2.系统需求分析2.2.1.系统目标设计系统开发的总目标开发一个类似QQ的聊天室系统,即HappyChat聊天系统。2.2.2.系统功能需求分析该系统应具有如下功能:1、用户注册、登录、退出;2、群聊、私聊;3、服务器发送系统消息;4、服务器踢人;5、保存日志;6、保存聊天信息;7、显示在线好友、消息提醒等;8、显示即时时间;2.2.3.系统功能描述1.服务器端 (1).处理用户注册 (2).处理用户登录 (3).处理用户发送信息 (4).处理用户得到信息 (5).处理用户退出2.客户端 (1).用户注册界面及结果 (2).用户登录界面及结果 (3).用户发送信息界面及结果 (4).用户得到信息界面及结果 (5).用户退出界面及结果2.2.4.系统设计1、服务器结构服务器端结构图示2、客户端结构客户端结构图示1、AppServer.java 为服务器端监听类,负责服务器的启动,包括启动监听端口、服务器监控界面。2、ServerFrame.java为服务器监控窗体,负责监控服务器运行状态。3、Connection.java为服务器连接处理的具体实现。4、ChatClient.java为客户端程序启动类,负责客户端的启动和退出。5、Login.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。6、Register.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。7、ChatRoom.java为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器的Connection合作。8、Windowclose为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。9、Clock.java为客户端程序的一个小程序,实现的一个石英钟功能。三、实现细节概述:聊天室主要功能的实现:从界面输入登录信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket,专门负责与此客户端socket的通信。一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。客户方和服务方都可以通过关闭本方的socket而结束一次通讯过程。为了实现多客户在线的请求,使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理。3.1客户端细节3.1.1.注册:当选择注册时,Register界面等待用户输入注册信息,并将信息封装成Register_Customer类,然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。客户端显示注册结果。3.1.2.登录:当选择登录时,客户端由Login界面等待用户输入登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。若登录成功,客户端将启动聊天室主界面。3.1.3.聊天a、发送聊天信息:私聊功能需在在线列表中选中私聊聊天对象,并勾选私聊选项。群聊功能取消对私聊功能的勾选即可。当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、表情和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。b、接收聊天信息:用一个单独的接收线程实现,客户端必须随时接收服务器发来的消息,而读取消息的方法采用的是阻塞式方法,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。发送和接收可以同时进行。3.2、服务器端细节3.2.1.注册:创建一个File文件类,载入“user.txt”,再用对象输入流ObjectInputStream包装File文件类,将存储在“user.txt”得向量对象Vector中载入内存中,现在系统中的向量就是对象型数据库,存储着每条用户信息对象。判断是否是第一个注册用户,判断用户名是否已经存在,判断用户名是否为系统关键字,用户名有效后写入数据库,并给客户端返回信息,关闭Socket连接。3.2.2.登录:去数据库读用户数据,打开用户数据库文件“user.txt”,将用户数据对象集载入内存,以供下面的程序使用。验证用户名是否存在,验证用户密码是否正确,验证用户是否已经登录,验证是否已经超过最大登录人数,如果以上验证全部正确,返回客户端信息,关闭Socket连接。3.2.3.退出:接收退出信息,当用户退出时,客户端将会用基于Socket的对象输出流发给服务器退出对象,把用户从在线列表中删除,更新在线列表。3.2.4.聊天:接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提出消息类型,再根据类型将消息强制转化ChatMessage,调用ChatMeaage中方法,获取目的客户名称列表,根据目的地用户名从用户名、socket键值表中获取socket,再通过socket将Message转发到相应的用户。四、系统展示1、注册客户端注册界面登录客户端登录界面聊天界面聊天界面4、服务器界面服务器管理界面服务器用户信息管理界面测试与运行记录5.1.注册账号测试用例编号输入/动作期望的输出/相应1用户名和密码均为数字,进行注册注册成功2用户名和密码均为字母,进行注册注册成功3用户名为数字,密码为字母,进行注册注册成功4用户名为字母,密码为数字注册成功5必填项分别为空注册显示必填信息6用户名含有非法字符注册显示用户名字符验证提示信息7密码含有非法字符注册显示密码字符验证提示信息8两次输入密码不一致进行注册显示两次输入密码不一致提示信息9以已经注册的用户名进行注册显示用户名已存在提示信息10非法邮箱进行注册显示邮箱格式不正确提示信息5.2.登录测试用例编号输入/动作期望的输出/相应1使用合法用户名和密码登陆登陆成功2使用错误的用户名或密码登陆显示用户名或密码错误提示信息3用户名为空登陆显示请输入用户名提示信息4改变合法用户名或密码的大小写登陆显示用户名或密码错误提示信息5在合法用户名或密码前插入空格显示用户名或密码错误提示信息6在合法用户名或密码中间插入空格显示用户名或密码错误提示信息7在合法用户名或密码后插入空格显示用户名或密码错误提示信息8使用已被禁用的账号登陆显示账号被禁用等相应提示信息9使用已被删除的账号登陆显示不存在此用户等相应提示信息11密码为空进行登陆显示请输入密码,密码不能为空提示信息12用户名和密码均为空登陆显示请输入用户名和密码提示信息六、课程设计完成结果分析经过几周的课程设计,我深刻的认识到在软件开发过程中要开发一个成功的软件,软件文档是一个必不可少的东西,它关系着软件开发的过程,关系着软件开发的成败。开发经验不足,在软件的开发过程中遇到了很多复杂的问题,比如模块的划分、数据库的设计等问题不知道怎么解决,最终通过努力也成功解决了这些问题。通过几周的软件工程课程设计,我基本掌握了软件工程的基本思想以及软件开发的基本流程。并受到了一次用专业知识、专业技能分析和解决问题的全面系统的锻炼。并且在综合知识的选用方面,在应用软件开发的基本思想、方法方面,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。在这次的课程设计中,让我们深深地体现到进行软件开发不是一件简单的事情,它需要设计者具有全面的专业知识、缜密的思维、严谨的工作态度以及较高的分析问题、解决问题的能力,而我在很多方面还有欠缺。在以后的学习过程中我会从这次课程设计中汲取教训并寻求高效率优方法的学习态度不断充实自我完善自我。七、程序聊天室主页面:importjavax.swing.*;importjavax.swing.event.ChangeEvent;importjavax.swing.event.ChangeListener;importjava.awt.*;importjava.awt.event.*;import.*;importjava.io.*;importjava.util.*;/*<p>Title:HappyChat聊天系统聊天程序</p>*<p>Description:系统用户登录后进行聊天</p>*/publicclassChatRoomextendsThreadimplementsActionListener{ privateJComboBoxdaXiaoComboBox; privateJComboBoxyangShiComboBox; privateJComboBoxzitiComboBox; privateJComboBoxemote; staticJFramefrmChat; JPanelpnlChat; JButtonbtnCls,btnExit,btnSend,btnClear,btnSave,btnTimer; JLabellblUserList,lblUserMessage,lblSendMessage,lblChatUser; JLabellblUserTotal,lblCount,lblBack; JTextFieldtxtMessage; java.awt.ListlstUserList; TextAreataUserMessage; JComboBoxcmbUser; JCheckBoxchPrivateChat; StringstrServerIp,strLoginName; Threadthread; finalJLabelheadLabel=newJLabel(); //用于将窗口用于定位 Dimensionscrnsize; Toolkittoolkit=Toolkit.getDefaultToolkit(); Messagemessobj=null; StringserverMessage=""; finalJSliderblueSlider=newJSlider(); finalJSliderredSlider=newJSlider(); finalJSlidergreenSlider=newJSlider(); finalJLabelhanziLabel=newJLabel(); //构造方法 publicChatRoom(Stringname,Stringip){ //Dialogd=newFontDialog(); strServerIp=ip; strLoginName=name; frmChat=newJFrame("聊天室"+"[用户:"+name+"]"); pnlChat=newJPanel(); frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmChat.getContentPane().add(pnlChat); FontfntDisp1=newFont("宋体",Font.PLAIN,12); Stringlist[]={"所有人"}; btnCls=newJButton("清屏(C)"); btnExit=newJButton("退出(X)"); btnSend=newJButton("发送(N)"); btnSave=newJButton("保存(S)"); btnTimer=newJButton("时钟(T)"); lblUserList=newJLabel("【在线用户列表】"); lblUserMessage=newJLabel("【聊天信息】"); lblSendMessage=newJLabel("聊天内容:"); lblChatUser=newJLabel("你对:"); lblUserTotal=newJLabel("在线人数:"); lblCount=newJLabel("0"); lstUserList=newjava.awt.List(); txtMessage=newJTextField(170); cmbUser=newJComboBox(list); //chenmin cmbUser.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshHead(); } }); chPrivateChat=newJCheckBox("私聊"); taUserMessage=newTextArea("",300,200, TextArea.SCROLLBARS_VERTICAL_ONLY);//只能向下滚动 //taUserMessage.setText("aaaaaa汉字aaaa"); taUserMessage.setForeground(newColor(0,0,0)); taUserMessage.setEditable(false);//不可写入 /*********************************************************************** *该布局采用手动布局setBounds设置组件位置*setFont设置字体、字型、字号*setForeground设置文字的颜色* *setBackground设置背景色*setOpaque将背景设置为透明 */ pnlChat.setLayout(null); pnlChat.setBackground(newColor(52,130,203)); btnTimer.setBounds(400,360,80,25); btnSave.setBounds(500,330,80,25); btnCls.setBounds(400,330,80,25); btnExit.setBounds(500,360,80,25); btnSend.setBounds(500,300,80,25); lblUserList.setBounds(5,0,120,40); lblUserTotal.setBounds(130,0,60,40); lblCount.setBounds(190,0,60,40); lblUserMessage.setBounds(225,0,180,40); lblChatUser.setBounds(10,290,40,40); lblSendMessage.setBounds(210,290,60,40); //lblUserTotal.setBounds(10,340,100,40); //lblCount.setBounds(73,340,100,40); lstUserList.setBounds(5,40,210,255); taUserMessage.setBounds(225,40,360,255); txtMessage.setBounds(270,300,210,25); cmbUser.setBounds(50,300,80,25); chPrivateChat.setBounds(333,336,60,20); btnTimer.setFont(fntDisp1); btnCls.setFont(fntDisp1); btnExit.setFont(fntDisp1); btnSend.setFont(fntDisp1); btnSave.setFont(fntDisp1); lblUserList.setFont(fntDisp1); lblUserMessage.setFont(fntDisp1); lblChatUser.setFont(fntDisp1); lblSendMessage.setFont(fntDisp1); lblUserTotal.setFont(fntDisp1); lblCount.setFont(fntDisp1); cmbUser.setFont(fntDisp1); chPrivateChat.setFont(fntDisp1); //taUserMessage.setFont(newFont("新宋体",Font.BOLD|Font.ITALIC,20)); lblUserList.setForeground(Color.YELLOW); lblUserMessage.setForeground(Color.YELLOW); lblSendMessage.setForeground(Color.black); lblChatUser.setForeground(Color.black); lblSendMessage.setForeground(Color.black); lblUserTotal.setForeground(Color.YELLOW); lblCount.setForeground(Color.YELLOW); cmbUser.setForeground(Color.black); chPrivateChat.setForeground(Color.black); lstUserList.setBackground(Color.white); taUserMessage.setBackground(Color.white); btnTimer.setBackground(Color.ORANGE); btnCls.setBackground(Color.ORANGE); btnExit.setBackground(Color.ORANGE); btnSend.setBackground(Color.PINK); btnSave.setBackground(Color.ORANGE); pnlChat.add(btnTimer); pnlChat.add(btnCls); pnlChat.add(btnExit); pnlChat.add(btnSend); pnlChat.add(btnSave); pnlChat.add(lblUserList); pnlChat.add(lblUserMessage); pnlChat.add(lblSendMessage); pnlChat.add(lblChatUser); pnlChat.add(lblUserTotal); pnlChat.add(lblCount); pnlChat.add(lstUserList); pnlChat.add(taUserMessage); pnlChat.add(txtMessage); pnlChat.add(cmbUser); pnlChat.add(chPrivateChat); frmChat.addWindowListener(newWindowclose()); btnTimer.addActionListener(this); btnCls.addActionListener(this); btnExit.addActionListener(this); btnSend.addActionListener(this); btnSave.addActionListener(this); lstUserList.addActionListener(this); txtMessage.addActionListener(this); headLabel.setHorizontalAlignment(SwingConstants.CENTER); headLabel.setIcon(newImageIcon("face//1.JPG")); headLabel.setBounds(15,335,70,60); pnlChat.add(headLabel); emote=newJComboBox(); emote.setModel(newDefaultComboBoxModel(newString[]{"表情","微笑", "甜笑","惊喜","嘻嘻","扮酷","嘿嘿","傻笑","好奇","媚眼","鬼脸","陶醉", "害羞","生气","嚷嚷","发怒","伤心","高明","菜鸟","问号","狂笑","大哭", "示爱","呻吟","想想"})); emote.setBounds(141,301,60,23); pnlChat.add(emote); zitiComboBox=newJComboBox(); zitiComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); zitiComboBox.setModel(newDefaultComboBoxModel(newString[]{"宋体", "黑体"})); zitiComboBox.setBounds(76,337,64,23); pnlChat.add(zitiComboBox); yangShiComboBox=newJComboBox(); yangShiComboBox.setModel(newDefaultComboBoxModel(newString[]{"正规", "粗体","斜体","粗斜"})); yangShiComboBox.setBounds(153,337,52,23); yangShiComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); pnlChat.add(yangShiComboBox); daXiaoComboBox=newJComboBox(); daXiaoComboBox.setModel(newDefaultComboBoxModel(newString[]{"12", "14","16","18","20"})); daXiaoComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); daXiaoComboBox.setBounds(220,335,40,23); pnlChat.add(daXiaoComboBox); blueSlider.setMaximum(255); blueSlider.setValue(128); blueSlider.setMinimum(0); blueSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自动生成方法存根 freshColor(); } }); //slider.setModel(null); blueSlider.setBounds(80,365,180,10); pnlChat.add(blueSlider); redSlider.setMaximum(255); redSlider.setValue(128); redSlider.setMinimum(0); redSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自动生成方法存根 freshColor(); } }); redSlider.setBounds(80,380,180,10); pnlChat.add(redSlider); greenSlider.setMaximum(255); greenSlider.setValue(128); greenSlider.setMinimum(0); greenSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自动生成方法存根 freshColor(); } }); greenSlider.setBounds(80,395,180,10); pnlChat.add(greenSlider); hanziLabel.setForeground(newColor(128,128,128)); hanziLabel.setHorizontalAlignment(SwingConstants.CENTER); hanziLabel.setFont(newFont("宋体",Font.BOLD,18)); hanziLabel.setBackground(Color.ORANGE); hanziLabel.setText("汉字"); hanziLabel.setBounds(273,360,57,50); pnlChat.add(hanziLabel); //启动聊天页面信息刷新线程 Threadthread=newThread(this); thread.start(); //Iconlog=newImageIcon("images\\chat.jpg"); //lblBack=newJLabel(log); //lblBack.setBounds(1,1,600,420); //pnlChat.add(lblBack); frmChat.setSize(600,461); frmChat.setVisible(true); frmChat.setResizable(false); //将窗口定位在屏幕中央 scrnsize=toolkit.getScreenSize(); frmChat.setLocation(scrnsize.width/2-frmChat.getWidth()/2, scrnsize.height/2-frmChat.getHeight()/2); Imageimg=toolkit.getImage("images\\appico.jpg"); frmChat.setIconImage(img); }//构造方法结束 protectedvoidfreshFont(){ //TODO自动生成方法存根 Stringziti=zitiComboBox.getSelectedItem().toString(); intyangShi=0; StringyangShiString=yangShiComboBox.getSelectedItem().toString(); if(yangShiString.equals("常规")){ yangShi=Font.PLAIN; }elseif(yangShiString.equals("粗体")){ yangShi=Font.BOLD; }elseif(yangShiString.equals("斜体")){ yangShi=Font.ITALIC; }elseif(yangShiString.equals("粗斜")){ yangShi=Font.BOLD|Font.ITALIC; } intdaXiao=Integer.parseInt(daXiaoComboBox.getSelectedItem() .toString()); taUserMessage.setFont(newFont(ziti,yangShi,daXiao)); taUserMessage.setForeground(hanziLabel.getForeground()); } protectedvoidfreshColor(){ //TODO自动生成方法存根 hanziLabel.setForeground(newColor(blueSlider.getValue(),redSlider .getValue(),greenSlider.getValue())); freshFont(); } @SuppressWarnings("deprecation") publicvoidrun(){ intintMessageCounter=0; intintUserTotal=0; booleanisFirstLogin=true;//判断是否刚登陆 booleanisFound;//判断是否找到用户 Vectoruser_exit=newVector(); try{ //SockettoServer; //toServer=newSocket(strServerIp,1001); for(;;){ SockettoServer; toServer=newSocket(strServerIp,1001); //将信息发往服务器 messobj=newMessage(); ObjectOutputStreamstreamtoserver=newObjectOutputStream( toServer.getOutputStream()); streamtoserver.writeObject((Message)messobj); //收来自服务器的信息 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getInputStream()); messobj=(Message)streamfromserver.readObject(); ////////刷新聊天信息列表////////// if(isFirstLogin)//如果刚登陆 { intMessageCounter=messobj.chat.size();//屏蔽该用户登陆前的聊天内容 isFirstLogin=false; } if(strLoginName.equals(messobj.ti)){ //taUserMessage.append("nibeiti"); exitChatRoom(); JOptionPane.showMessageDialog(null,strLoginName +"你被管理员剔除!"); } if(!serverMessage.equals(messobj.serverMessage)){ serverMessage=messobj.serverMessage; taUserMessage.append("[系统消息]:"+serverMessage+"\n"); } //taUserMessage.setText(""); for(inti=intMessageCounter;i<messobj.chat.size();i++){ Chattemp=(Chat)messobj.chat.elementAt(i); //chenmin Stringemote=temp.emote; if(emote.equals("表情")){ emote=""; }else{ emote+="地"; } Stringtemp_message; if(temp.chatUser.equals(strLoginName)){ if(temp.chatToUser.equals(strLoginName)){ temp_message="系统提示您:请不要自言自语!"+"\n"; }else{ if(!temp.whisper)//不是悄悄话 { temp_message="【你】对【"+temp.chatToUser+"】" +emote+"说:"+temp.chatMessage +"\n"; }else{ temp_message="【你】悄悄对【"+temp.chatToUser +"】"+emote+"说:"+temp.chatMessage +"\n"; } } }else{ if(temp.chatToUser.equals(strLoginName)){ if(!temp.whisper)//不是悄悄话 { temp_message="【"+temp.chatUser+"】对【你】" +emote+"说:"+temp.chatMessage +"\n"; }else{ temp_message="【"+temp.chatUser+"】悄悄对【你】" +emote+"说:"+temp.chatMessage +"\n"; } }else{ if(!temp.chatUser.equals(temp.chatToUser))//对方没有自言自语 { if(!temp.whisper)//不是悄悄话 { temp_message="【"+temp.chatUser+"】对【" +temp.chatToUser+"】"+emote +"说:"+temp.chatMessage+"\n"; }else{ temp_message=""; } }else{ temp_message=""; } } } taUserMessage.append(temp_message); intMessageCounter++; } ////////刷新在线用户////////// lstUserList.clear(); for(inti=0;i<messobj.userOnLine.size();i++){ StringUser=((Customer)messobj.userOnLine.elementAt(i)).custName; lstUserList.addItem(User); } Integera=newInteger(messobj.userOnLine.size()); lblCount.setText(a.toString()); //显示用户进入聊天室的信息 if(messobj.userOnLine.size()>intUserTotal){ //chenmin Stringtempstr=((Customer)messobj.userOnLine .elementAt(messobj.userOnLine.size()-1)).custName; //Stringtempstr=messobj.userOnLine.elementAt( //messobj.userOnLine.size()-1).toString(); if(!tempstr.equals(strLoginName)){ taUserMessage.append("【"+tempstr+"】来了"+"\n"); } } //显示用户离开聊天室的信息 //显示用户离开聊天室的信息 if(messobj.userOnLine.size()<intUserTotal){ for(intb=0;b<user_exit.size();b++){ isFound=false; for(intc=0;c<messobj.userOnLine.size();c++){ Stringtempstr=((Customer)user_exit.elementAt(b)).custName; if(tempstr.equals(((Customer)messobj.userOnLine .elementAt(c)).custName)){ isFound=true; break; } } if(!isFound)//没有发现该用户 { Stringtempstr=((Customer)user_exit.elementAt(b)).custName; if(!tempstr.equals(strLoginName)){ taUserMessage.append("【"+tempstr+"】走了" +"\n"); } } } } user_exit=messobj.userOnLine; intUserTotal=messobj.userOnLine.size(); streamtoserver.close(); streamfromserver.close(); toServer.close(); Thread.sleep(3000); } }catch(Exceptione){ @SuppressWarnings("unused") JOptionPanejop=newJOptionPane(); JOptionPane.showMessageDialog(null,"不能连接服务器!"); e.printStackTrace(); frmChat.dispose(); //System.out.println(); //System.out.println(e.getMessage()); } }//run()结束 privatevoidexitChatRoom(){ //TODO自动生成方法存根 exit(); } ///////////监听按钮响应////////////// publicvoidactionPerformed(ActionEventae){ Objectsource=(Object)ae.getSource(); if(source.equals(btnTimer)){ newClock(); } if(source.equals(btnCls)){ clearMessage(); } if(source.equals(btnExit)){ exit(); } if(source.equals(btnSend)){ sendMessage(); } if(source.equals(btnSave)){ saveMessage(); } if(source.equals(lstUserList))//双击列表框 { changeUser(); } }//actionPerformed()结束 ///////////监听窗口关闭响应////////////// classWindowcloseextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ exit(); } } //"清屏"按钮 publicvoidclearMessage(){ taUserMessage.setText(""); } //"退出"按钮 publicvoidexit(){ Exitexit=newExit(); exit.exitname=strLoginName; //发送退出信息 try{ SockettoServer=newSocket(strServerIp,1001); //向服务器发送信息 ObjectOutputStreamoutObj=newObjectOutputStream(toServer .getOutputStream()); outObj.writeObject(exit); outObj.close(); toServer.close(); frmChat.dispose(); //this.destroy(); }catch(Exceptione){ } }//exit()结束 //"发送"按钮 publicvoidsendMessage(){ Chatchatobj=newChat(); chatobj.chatUser=strLoginName; chatobj.chatMessage=txtMessage.getText(); chatobj.chatToUser=String.valueOf(cmbUser.getSelectedItem()); chatobj.whisper=chPrivateChat

温馨提示

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

评论

0/150

提交评论