版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、. . . . 1 / 29*实践教学实践教学* 理工大学理工大学计算机与通信学院2013 年秋季学期JAVAJAVA 课程设计课程设计 题 目:聊天程序 专业班级:计算机科学与技术 姓 名: 学 号: 指导教师 :成 绩:_ . . . . 2 / 29摘要摘要聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过 Java 提供的 Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而 Java 提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用 SQL Server2005 完
2、成并通过 JDBC 数据库。本设计建立在 JAVA 平台上,本设计使用了面向对象技术和面向对象的设计原则。系统采用 C/S 结构,客户端与客户端以与客户端与服务器端之间通过Socket 传送消息。使用 JAVA 语言编写,开发工具采用 Eclipse。服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。大大增强了程序对服务器资源的利用。聊天系统完成后将可进行多人对多人的聊天,对好友进行添加、删除,对新用户的注册,发送消息、接受消息等等功能。关键字:关键字:C/S;数据库;Eclipse;Socket;多线程. . . . II / 29序序 言
3、言在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多人生活中必不可少的一部分,基于这样的需求,出现了许多网络聊天通信工具,像 ,MSN 等等,但是人们已经不再满足于单一的两个人之间的聊天,而是对多人同时聊天产生了兴趣,于是出现了网络聊天室,不同地方的人可以在那个虚拟的聊天室里面热烈聊天。基于这样的想法,我们用 JAVA 设计一个多人同时聊天的小程序,用 Socket 编程实现网络通讯,面向连接的,采用多线程的实现技术。 基于 Socket 的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低
4、廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业部局域网的各种通信需求。 基于 Socket 的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了 Socket 通信的原理,并且在企业部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。 基于 Socket 的局域网通信软件应用围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。. . . . 3 / 29目目 录录摘要摘要 2 2序序 言言.
5、IIII第第 1 1 章章 系统分析与设计系统分析与设计.1 11.1 系统功能需求 .11.1.1 服务器端 .11.1.2 客户端 .11.2 模块设计 .11.3 数据库设计 .3第第 2 2 章章 详细设计详细设计.4 42.1 数据库模块操作 .42.2 登录与聊天室选择模块 .42.3 注册模块(REGISTERFRAME.JAVA) .62.4 管理用户模块(MANGEFRAME.JAVA).72.5 聊天模块 .92.5.1 聊天室界面(ChatFrame.java).92.5.2 聊天室对话框(ChatDialog.java) .112.5.3 监听线程 (Listen.ja
6、va) .122.5.4 服务器线程(ChatServer.java) .13第第 3 3 章章 系统测试系统测试.18183.1 测试方案 .183.2 测试结果 .183.2.1 登录与聊天室选择效果演示 .183.2.2 注册效果演示 .193.2.3 管理用户效果演示 .203.2.4 聊天室效果演示 .20第第 4 4 章章 软件使用说明书软件使用说明书.22224.1 性能描述 .224.2 使用约束 .224.3 其基本实现过程 .22设计总结设计总结.2323参考文献参考文献 2424致致.2525. . . . 1 / 29第第 1 1 章系统分析与设计章系统分析与设计随着互
7、联网的发展,网上聊天已经成为当今的一种时尚, ,MSN 等聊天工具为人们提供一个更为广大的交流平台。本设计的聊天系统实现了网络聊天室的登录,注册,聊天室的选择等功能,并支持单人和多人聊天方式,同时也加入了管理员的角色,管理员对聊天室的用户进行管理,包括删除用户和赶出聊天室。1.11.1 系统功能需求系统功能需求本系统主要通过客户端,服务器端来体现聊天系统的基本功能。1.1.1 服务器端1.处理用户注册2.处理用户登录3.处理用户发送信息,服务器监控聊天容4.处理用户得到信息5.处理用户退出1.1.2 客户端1.用户注册界面与结果2.用户登录界面与结果3.用户发送信息界面与结果4.用户得到信息界
8、面与结果5.用户退出界面与结果1.21.2 模块设计模块设计通过上述需求分析,本系统分为登录与选择聊天室模块,注册模块,聊天模块,管理用户模块,数据库操作模块五大模块,具体描述如表 1-1. . . . 2 / 29表 1-1 聊天系统模块表 模块名类名功能描述数据库操作模块DBHandler封装了一下 JDBC 的 API,向本聊天系统提供数据库操作方面的接口。LoginFrame登陆界面,其中提供权限检测的功能登录与选择模块SelRoomFrame聊天室选择界面,提供了聊天室选择功能注册模块SelRoomFrame注册界面,提供普通用户注册功能管理用户模块ManageFrame管理用户界面
9、,提供管理员删除用户的功能ChatFrame聊天界面,提供用户聊天功能,支持单人聊天,多人聊天,以与管理员赶人的功能ChatServer聊天服务器,用来转发,过滤用户的聊天信息,以与向用户发送信息ChatDialog供用户输入聊天信息的对话框聊天模块Listen用户监听聊天服务器的线程在整个聊天系统中里,数据库操作模块提供了相应的数据库接口,比如添加注册用户,删除用户,获取用户的权限等。登录与聊天室选择模块分成登录和聊天室选择两部分。登录界面是管理员和普通用户的入口,普通用户可以从登陆界面进入注册界面或者聊天室选择界面,管理员可以聊天室界面或者管理员用户界面。聊天室选择界面提供了“谈天说地”,
10、“缘分天空”,“休闲娱乐”三个聊天室选择,用户可以任意选择一个进入。注册模块提供了普通用户的注册功能。新用户注册需要输入用户名和密码,当系统中有重名时会弹出警告,要求用户重新输入。管理用户模块提供了删除用户的功能。管理员可以将普通用户从系统中删除,被删除用户不能登录聊天系统。聊天模块包含服务器端和客户端两部分。客户端聊天界面包含聊天在线用. . . . 3 / 29户列表以与聊天信息发布区域。聊天对话框是用户输入聊天信息的地方。客户端通过启动监听进程。1.31.3 数据库设计数据库设计本聊天系统使用 SQL Server 2005 作为后台支持的数据库,根据需求分析的结果,使用数据库中系统数据
11、库“model”,在此数据库里存放所有关于实现聊天逻辑的数据表。在“model”数据库中创建名为“userInfo”的表,用来记录用户的注册数据,包括用户名,密码以与用户权限。其中字段如表 2表 1-2 userInfo 表结构字段中文描述数据类型是否为空备注userID描述登录信息的 IDint否自增长,主键name登录用户名Varchar(50)否password登录密码Varchar(50)否role用户权限int是0 表示管理员1 表示普通用户. . . . 4 / 29第第 2 2 章章 详细设计详细设计2.12.1 数据库模块操作数据库模块操作本设计使用的是 JDBC 连接 SQL
12、 Server 2005 数据库,其核心代码如下。privatestaticprivatestatic Connection getConn() / 数据库的URLString url = jdbc:sqlserver:/localhost:1433; DatabaseName=model;trytry Class.forName(.microsoft.sqlserver.jdbc.SQLServerDriver);String name = sa;String password = jiajunp;returnreturn (DriverManager.getConnection(url,
13、name, password); catchcatch (SQLException e) e.printStackTrace(); catchcatch (ClassNotFoundException e) e.printStackTrace();returnnullreturnnull;上面的代码是通过Class.forName(.microsoft.sqlserver.jdbc.SQLServerDriver)命令载入驱动JDBC的驱动程序,然后通过DriverManager.getConnection函数获取数据库的连接。其中连接数据库的URL为url = jdbc:sqlserver:
14、/localhost:1433; DatabaseName=model,用户名与密码自己数据库配置是用户名和密码所致的一致。2.22.2 登录与聊天室选择模块登录与聊天室选择模块登录界面是所有用户的入口,包括用户进入聊天室选择界面,用户注册界面的入口,以与为管理员提供的管理用户界面的入口。聊天室选择界面提供了“谈天说地”,“缘分天空”以与“休闲娱乐”三. . . . 5 / 29个可供选择的聊天室,用户每次登录只能选择其中一个聊天室,并且在同一个聊天室中用户只能保持一个连接。(1)登录界面的实现(LoginFrame.java)。登录界面中可以进行三种操作:登录,注册以与管理。在登录操作时,程
15、序会调用 DBHandler.java 类的 isAuthorized 的方法,验证用户是否具有权限。如果是,则创建 SelRoomFrame 对象,进入聊天室选择界面。在注册操作时,程序会创建 RegisterFrame 对象,进入注册界面。当管理动作发生后,程序会调用 DBHandler.java 类的 isAdmin 方法,判断用户是否为管理员。如果是,则创建 MangeFrame 对象,进入管理用户界面。publicpublic LoginFrame() trytry /设置显示外观为本地系统外观。注意此句需放在初始化所有控件之前。UIManager.setLookAndFeel(UI
16、Manager.getSystemLookAndFeelClassName(); catchcatch (Exception e) e.printStackTrace();initComponents();(2)聊天室选择界面(SelRoomFrame.java)。在本系统中有三个聊天室可供选择,“谈天说地”,“缘分天空”和“休闲娱乐”。用户可以选择任意一个聊天室进入。在聊天室选择界面中,用户可以进行聊天室选择动作,也可以退出回到登陆界面。当用户选择一个聊天室,并按下“进入”按钮后,将创建一个 ChatFrame 对象,进入聊天室界面。publicvoidpublicvoid actionPe
17、rformed(ActionEvent e) ifif(e.getActionCommand().equals(进入)String choice = getSelButton().getText();ifif(choice.equals(谈天说地)room = 谈天说地;elseifelseif(choice.equals(缘分天空) )room =缘分天空;. . . . 6 / 29elseelse /休闲娱乐room =休闲娱乐;ChatFrame chatframe = newnew ChatFrame(name,room,prio);thisthis.dispose();public
18、public AbstractButton getSelButton()Enumeration e = group.getElements();whilewhile(e.hasMoreElements()AbstractButton ab = e.nextElement();ifif(ab.isSelected()returnreturn ab;returnnullreturnnull;在使用单选按钮时,应该把所有按钮放入一个 ButtonGroup 里,以保证组的按钮只能有一个被选中。getButton()函数通过遍历 ButtonGroup 里所有的按钮,来确定被选中的按钮。Swing 中
19、所有的按钮都实现了 AbstractButton 接口,因此通过返回AbstractButton 接口来提高通用性。2.32.3 注册模块(注册模块(RegisterFrame.javaRegisterFrame.java)第一次登录聊天系统可以进行用户注册。在注册界面中,用户将提供登录所需的用户名和密码信息。密码将采用两次输入的方法来确认输入无误。当用户没有输入用户名或没有输入密码或两次输入的密码不一致时,将会有相应的对话框弹出。用户注册信息将通过调用 DBHandler 类的 regUser 方法保存到userInfo 表中。如果数据库操作失败,将会弹出提示失败的对话框,如果注册成功,将返
20、回登陆界面。public void actionPerformed(ActionEvent e) if (e.getActionCommand().equals(注册) /用户点击“注册”按钮if (!(jTextFieldPw1.getText().equals(jTextFieldPw2.getText() JOptionPane.showMessageDialog(this, 密码不一致!请. . . . 7 / 29重新输入);return;if (jTextFieldPw1.getText().equals() JOptionPane.showMessageDialog(this,
21、密码不能为空!);return;if (jTextFieldName.getText().equals() JOptionPane.showMessageDialog(this, 用户名不能为空!);return;int status = DBHandler.regUser(jTextFieldName.getText(),jTextFieldPw1.getText();if (status = 0) JOptionPane.showMessageDialog(this, 注册成功!);f.show();this.dispose(); else if (status = 1) JOptionP
22、ane.showMessageDialog(this, 有重名!);return; else JOptionPane.showMessageDialog(this, 数据库操作失败!);return; else if (e.getActionCommand().equals(退出) /用户按下“退出”按钮。f.show();this.dispose();2.42.4 管理用户模块(管理用户模块(MangeFrame.javaMangeFrame.java)管理模块是只有管理员才能进入的区域,管理员通过管理员模块对整个聊天系统进行管理。管理员模块提供给管理员的功能主要是从数据库中删除不好的聊天用
23、户。publicpublic ManageFrame(LoginFrame f) loginf = f;trytry /设置显示外观为本地系统外观。注意此句需放在初始化所有控件之前。UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(). . . . 8 / 29; catchcatch (Exception e) e.printStackTrace();initComponents();thisthis.setVisible(truetrue);publicvoidpublicvoid actionPerforme
24、d(ActionEvent e) ifif (e.getActionCommand().equals(删除) String selItems = list.getSelectedItems();ifif (selItems.length = 0) JOptionPane.showMessageDialog(thisthis, 请选择被删除的人!);returnreturn;ifif (JOptionPane.showConfirmDialog(thisthis, 确定要删除么?, ,JOptionPane.OK_CANCEL_OPTION) = JOptionPane.CANCEL_OPTIO
25、N) returnreturn;forfor (intint i = 0; i selItems.length; i+) ifif (!DBHandler.deleteUser(selItemsi) JOptionPane.showMessageDialog(thisthis, 删除 + selItemsi+ 失败); elseelse list.remove(selItemsi);list.repaint(); elseelse loginf.show();dispose();如果不选择用户,而直接单击“删除”按钮,则会弹出“请选择删除的人!”的对话框。管理员可以同时删除多个用户。在删除用户
26、是会弹出“确定要删除么?”的对话框。如果选择“是”,将进行删除操作;如果选择“否”则不删除。当删除操作失败时,会弹出“失败失败”的对话框。. . . . 9 / 292.52.5 聊天模块聊天模块聊天模块是整个系统的核心模块,按功能可以分为普通用户聊天和管理员聊天两部分。普通用户部分实现单人和多人聊天模式,以与防止重复登录功能。管理员聊天部分除了普通用户聊天功能之外还加入了“踢人”功能。表 2-1 聊天系统消息表 类型格式传递方向解释loginLogin:双向通知服务器用户登录namelistNmaelist:服务器到用户服务器把聊天室在线用户发送给用户notifynotify: 服务器到用户
27、通知指定用户消息kickKick::双向通知踢人的消息talkTalk:用户到服务器用户 1 向用户 2 传送信息quitQuit::双向用户离开聊天室reloadReload:::服务器到用户服务器通知用户重复登录聊天模块由聊天室界面(ChatFrame.java),服务器(ChatServer.java),聊天对话框(ChatDialog.java)以与用户监听线程(Listen.java)组成。2.5.1 聊天室界面(ChatFrame.java)在聊天室界面中,用户可以进行单人和多人聊天。在聊天室界面初始化的时候会产生一个客户端 socket,用来与服务器进行连接。同时会新建一个监听进
28、程 listen 来练接服务器端的消息。当用户按下“聊天”或者“对所有人聊天”按钮后,将弹出聊天输入对话框。当管理员按下“踢人”按钮后,将向服务器发送 kick 消息。. . . . 10 / 29在聊天室界面代码中覆盖率 processWindowEvent 函数,用来处理用户关闭窗口操作。用户关闭窗口时,向服务器发送 quit 消息,然后断开 socket 连接。部分代码如下:public void actionPerformed(ActionEvent e) if(e.getActionCommand().equals(聊天)/如果“聊天按钮被按下” if(selList.getSele
29、ctedItems().length!=0) dialog.input.setText(); dialog.input.setEditable(true); dialog.show(); dialog.input.requestFocus(); else JOptionPane.showMessageDialog(this, 请选择聊天对象!); return; if(e.getActionCommand().equals(对所有人聊天)/如果“对所有人聊天”按钮被按下/选择所有成员for(int i=0;iselList.countItems();i+)selList.select(i);
30、dialog.input.setText(); dialog.input.setEditable(true); dialog.show(); dialog.input.requestFocus();if(e.getActionCommand().equals(踢走) /处理踢人操作String selItems =selList.getSelectedItems();if(selItems.length=0)JOptionPane.showMessageDialog(this, 请选择踢走对象!);return;/构造kick消息,格式为kick:room:nameStringBuffer s
31、bf =new StringBuffer(kick:+room+:);for(int i=0;iselItems.length;i+)String kickname = selItemsi;. . . . 11 / 29if(!kickname.equals(name)sbf.append(kickname+,);sbf.append(:+name);sendMessage(sbf.toString();在聊天室界面初始化的时候会产生一个客户端 socket,用来与服务器端进行连接。同时会新建一个监听进程 listen 来接收服务器端的消息。在聊天室界面代码中覆盖了 processWindow
32、Event 函数,用来处理用户关闭窗口操作。用户关闭窗口时,向服务器发送 quit 消息,然后断开 socket 连接。2.5.2 聊天室对话框(ChatDialog.java)聊天室对话框是用户输入聊天信息的地方。当用户进入聊天室后,系统会产生一个对话框对象。用户单击“聊天”或者“对所有人聊天”按钮后,对话框将变成可见。用户输入完聊天信息单击“发送”按钮或者按下回车键后,对话框程序将把聊天消息封装成“Talk:”的形式,调用聊天室界面的 sendTalkMsg 函数将聊天消息发送。部分代码如下:public void sendTalkMsg() String selItems = ChatF
33、rame.selList.getSelectedItems();if (selItems = null | selItems.length = 0)return;StringBuffer sbf = new StringBuffer(talk: + ChatFrame.room + :);int i = 0;for (; i selItems.length - 1; i+) sbf.append(selItemsi);names.append(selItemsi);names.append(,);sbf.append(,);names.append(selItemsi);sbf.append(
34、selItemsi);. . . . 12 / 29 sbf.append(: + ChatF + :);sbf.append(input.getText();ChatFrame.msgArea.append(n你对 + names.toString() + 说:+ input.getText();ChatFrame.sendMessage(sbf.toString() + n);File f=new File(message.txt);try FileWriter w_file = new FileWriter(f,true); w_file.write(ChatFrame
35、.name + 对+ names.toString() + 说:+ input.getText()+n); w_file.close();catch(Exception evt)dispose(); /当用按下回车键时发送聊天信息class myKeyListener extends KeyAdapter public void keyReleased(KeyEvent k) if (k.getKeyCode() = 10) if (input.getText() != ) sendTalkMsg();程序加入了监听器,当用户按下回车时程序进入keyReleased函数,发送聊天信息。在sen
36、dTalkMsg函数中,用户创建一个talk消息,把谈话对象的名字在消息中用逗号隔开。2.5.3 监听线程 (Listen.java)由于 socket 的 readLine 方法是阻塞的,因此需要一个监听线程从服务器端接收消息,并进行相应的操作。在监听线程中,将要对收到的服务器端的消息进行解析,并做相应的操作。当监听线程收到 login 消息后,表示有新的用. . . . 13 / 29户进入聊天室。监听线程将从 login 消息中取出用户的,并在 ChatFrame 的成员列表中加入新登录的用户名。当监听线程收到 namelist 消息后,将从消息中取出该聊天室成员的名字,并加入到 Cha
37、tFrame 的成员列表中。public Listen(ChatFrame p,Socket s) parent = p; socket = s; try dis=new BufferedReader(new InputStreamReader(s.getInputStream(); catch(IOException e) System.out.println(Error:+e); 当监听线程收到 login 消息后,将从消息中取出登录用户的名字,并将加入到成员列表中。当监听线程收到 talk 消息后,将从消息中取出说话人的,以与消息容,并显示到消息发布区中。当监听线程收到 quit 消息后
38、,将从消息中取出离开用户的,并将该用户从成员列表中删除,同时将消息显示到消息发布区。当用户收到 relogin 或者 quit 消息后,用户将断开连接,退出聊天系统。2.5.4 服务器线程(ChatServer.java)服务器线程主要监听用户端的连接,并作为用户消息的中转站以与管理中心。当用户登录时,服务器端将收到用户发送的 login 消息,服务器端将建立和用户的一个连接 socket,并将该 socket 封装到一个 Clinet 对象中,然后加入到对应应用聊天室的用户链表中。当服务器收到 talk 消息时,则将 talk 消息的发送者从消息中取出,然后转发给所有信息接收者。当服务器收到
39、 quit 消息时,服务器将该消息广播给所有该聊天室的在线用户。当服务器收到 kick 消息时,服务器从消息中取出被踢走的用户的,然后向该用户发送 kick 消息,同时广播给其他用户。部分代码如下:/用户类,包含了用户socket信息classclass Client extendsextends Thread . . . . 14 / 29Socket socket;String name;String ip;DataInputStream dis;PrintStream ps;publicpublicArrayListclients;publicpublic String getChatt
40、er() returnreturnname;publicvoidpublicvoid send(String msg) ps.println(msg);ps.flush();System.out.println(thread sends + msg);publicpublic Client(Socket s) socket = s;trytry dis = newnew DataInputStream(s.getInputStream();ps = newnew PrintStream(s.getOutputStream(); catchcatch (IOException e) System
41、.out.println(Error: + e);/处理login消息publicvoidpublicvoid handleLogin(String line) line = line.substring(6);String room = line.substring(0, line.indexOf(:);setClients(room);line = line.substring(line.indexOf(:) + 1);name = line;rmRelogin(name);notifyRoom(login, login: + name + : + name + 进入聊天室!);priva
42、tevoidprivatevoid setClients(String room) ifif (room.equals(谈天说地) clients = ChatServer.clients1; elseifelseif (room.equals(缘分天空) clients = ChatServer.clients2; elseelse . . . . 15 / 29clients = ChatServer.clients3;/删除重复登陆的连接privatevoidprivatevoid rmRelogin(String name) forfor (intint i = 0; i client
43、s.size(); i+) Client c = (Client) clients.get(i);ifif (name.equals() c.send(relogin: + name);clients.remove(i);trytry c.socket.close(); catchcatch (IOException e) / TODOTODO Auto-generated catch blocke.printStackTrace();clients.add(thisthis);/向所有在线用户发送消息publicvoidpublicvoid notifyRoom(String m
44、sgType, String msg) synchronizedsynchronized (clients) StringBuffer sbf = newnew StringBuffer(namelist:);forfor (intint i = 0; i clients.size(); i+) Client c = (Client) clients.get(i);sbf.append();sbf.append(:);c.send(msg);ifif (msgType.equals(login) ps.println(sbf.toString();System.out.printl
45、n(n notifying login: namelist= + sbf.toString();ps.flush();/处理quit消息publicvoidpublicvoid handleQuit(String line) line = line.substring(5);String room = line.substring(0, line.indexOf(:) - 1);line = line.substring(line.indexOf(:) + 1);String name = line;notifyRoom(quit, quit: + name + : + name + 离开);
46、ChatServer.disconnect(thisthis);. . . . 16 / 29/处理talk消息publicvoidpublicvoid handleTalk(String line) line = line.substring(5);String room = line.substring(0, line.indexOf(:);line = line.substring(line.indexOf(:)+1);String to = line.substring(0, line.indexOf(:);line = line.substring(line.indexOf(:)+1
47、);String from = line.substring(0, line.indexOf(:);line = line.substring(line.indexOf(:) + 1);String chatto = to.split(,);synchronizedsynchronized (clients) forfor (intint i = 0; i clients.size(); i+) Client c = (Client) clients.get(i);forfor (intint j = 0; j chatto.length; j+) ifif (.equals(ch
48、attoj) c.send(talk: + from + 对你说: + line + n);/处理kick消息publicvoidpublicvoid handleKick(String line) StringTokenizer st = newnew StringTokenizer(line, :);String type = st.nextToken();String room = st.nextToken();String names = st.nextToken();String admin = st.nextToken();String kicks = names.split(,)
49、;synchronizedsynchronized (clients) forfor (intint i = 0; i clients.size(); i+) Client c = (Client) clients.get(i);forfor (intint j = 0; j kicks.length; j+) ifif (.equals(kicksj) c.send(kick:); elseelse c.send(nofity: + names + : + name + 被 + admin+ 踢出聊天室);forfor (intint i = 0; i kicks.length;
50、 i+) forfor (intint j = 0; j clients.size(); j+) Client c = (Client) clients.get(j);. . . . 17 / 29ifif (.equals(kicksi) trytry c.socket.close(); catchcatch (IOException e) e.printStackTrace();clients.remove(c);当服务器收到 login 消息,将新建一个 Client 类,并将该实例加入到相应聊天室的链表中,同时向该用户发送 namelist 消息,将 login 消息发送给相应聊天室的所有用户。当服务器收到 quit 消息,将把该用户服务器端对应的 Client 对象删除,并关掉 socket 连接,同时向该聊天室所有在线用户发送 quit 消息。当服务器收到 talk 消息,将把消息转发给所有接收 talk 消息的用户。当服务器收到 kick 消息,将向被踢出用户发送 kick 消息,并向该聊天室所有用户发送 notifty 消息。. . . . 18 / 29第第 3 3 章章 系统测试系统测试
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit8CollectingasaHobby单词课件沪教版英语七年级上册
- 房地产开发保证协议书
- 如何解除保本协议合同
- 工程安装合同增补协议
- 店铺合同到期收购协议
- 报废模具销售合同范本
- 工程合同诉讼解协议书
- 工地合作批发合同范本
- 工作工资协议合同范本
- 工厂维修房间合同范本
- 2025年全国注册监理工程师继续教育题库附答案
- 锅炉原理培训课件
- 重庆市高新技术产业开发区消防救援支队政府专职消防员招录(聘)114人参考题库附答案
- 《数据库设计》课件
- 牵引供电计算专题(面向交流)
- 杭州市失业人员登记表
- 新员工入职背景调查表 (职员)
- 云计算环境下中小企业会计信息化建设问题
- 《材料性能学》课件-第四章 材料的断裂韧性
- 超市服务培训课程课件
- 公务出行社会汽车租赁管理规范
评论
0/150
提交评论