1、课程设计答辩记录教师主要提问记录学生回答问题情况课程设计成绩评定答辩成绩(50%)课程设计报告撰写质量(50%)总分是否同意通过同意 不同意答辩小组成员签名: 年 月 日封面课程设计题目:即时聊天系统作者姓名:班 级:学 号:指导教师:日 期:2011年 5 月 日 作者签名:即时聊天系统 点对点,点对多点的网络聊天功能设计与实现摘 要本设计采用两层结构C/S模式,由客户端向服务器提出请求,服务器负责将客户端传过来的数据进行处理,并返回给客户端。本系统设计基于java的TCP Socket,服务端包含一个提供TCP连接服务的ServerSocket对象与一个参与通信的Socket对象,客户端只
2、包含一个参与通信的Socket对象。服务端通过继承Thread类,客户端通过实现Runnable接口分别实现了多线程程序设计,从而提高了系统性能和减少了系统开销。本系统的图形界面设计是通过java的AWT组件与Swing组件以及AWT组件event包中单击事件监听器接口(ActionListener)完成的。本系统实现了私聊、群聊功能,更新用户列表,上、下线提醒功能,脏话过滤功能,聊天快捷模板功能,登录验证功能(登录名不能为空)。关键词:C/S模式;java TCP Socket;多线程程序设计;java图形界面设计;私聊;群聊;更新用户列表;上、下线提醒;脏话过滤;聊天快捷模板;登录验证 即
3、时聊天系统共 16 页目 录1 引言11.1 课题背景11.2 课题现状11.3 本文主要工作12 即时聊天系统需求分析与开发工具22.1 系统目标22.2 系统要求的基本功能2 2.3 开发环境与工具-22.3.1 开发环境22.3.2 JAVA TCPSOCKET概述22.3.3 ECLIPSE3.6开发平台简介23 系统总体设计23.1 C/S模型23.2 JAVA TCPSOCKET通信流程描述33.2.1 C/S两端通过Socket机制进行连接-33.2.2 具体流程描述-43.3 多线程编程技术43.3.1 进程及线程概述43.3.2 JAVA对多线程编程的支持54 系统流程与实现
4、64.1 服务器模块详细设计64.2 客户端模块详细设计84.3 MESSAGEBEAN详细设计105 系统测试与分析11结 论16参考文献161 引言1.1 课题背景近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考
5、虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。 为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。 我在本文中将讨论一种基于Socket的局域网通信工具的设计与实现方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成
6、本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。 基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。1.2 课题现状 基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现 ,开发技术已经比较成熟,比如较早的ICQ,MSN Messang
7、er,Yahoo 通这些国外开发的产品,还有国产的有名的QQ,新浪UC,LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等。而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者U
8、DP/IP协议的软件产品。1.3 本文主要工作本文主要工作是设计一个可以跨平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。2 即时聊天系统需求分析与开发工具2.1 系统目标简单的及时聊天系统的实现(窗体程序实现),通过TCP协议,实现点对点,点对多点的网络聊天功能。 2.2 系统要求的基本功能 (1)实现点对点,点对多点的网络聊天,是本程序需要实现的最基本的功能。 (2)在线用户主机名列表的更新维护。 (3)上、下线提醒;脏话过滤;聊天快捷模板;登录验证;设置字体及文本背景
9、。 2.3 开发环境及工具2.3.1 开发环境 (1) 硬件环境 处理器:英特尔 Pentium(奔腾) 双核 T4200 2.00GHz 内存:1 GB ( 镁光 DDR3 1067MHz ) 网络:局域网。 (2) 软件环境 考虑到本人对Windows XP系统最为熟悉,故选择Windows XP平台。因Eclipse具有友好的集成开发界面、面向对象的可视化开发模式、良好的数据库及多媒体应用支持以及高效的软件开发与程序运行,功能更大,开发效率更高,不仅是网络环境下的优秀前端开发语言和工具,也是服务器端Web编程的优秀工具。操作系统:Windows XP或Linux。 开发工具:Eclips
10、e3.6。 2.3.2 Java TCPSocket概述Java的TCP Socket,服务端包含一个提供TCP连接服务的ServerSocket对象与一个参与通信的Socket对象,客户端只包含一个参与通信的Socket对象。 2.3.3 Eclipse3.6开发平台简介 开发平台我选用了Eclipse,因为一直以来都使用Eclipse进行学习,对这个IDE最为熟悉,再者Eclipse具有非常强大的功能,调试和运行java程序非常的方便,所以选择了Eclipse。3 系统总体设计3.1 C/S模型 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客
11、户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被唤醒并且为客户提供服务对客户的请求作出适当的反应。通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构最大的优点是将计算机工作任
12、务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。如下图所示:图3-1客户机服务器通信结构示图 3.2 Java TCPSocket通信流程描述3.2.1 C/S两端通过Socket机制进行连接 (1) 客户端的编程流程: a创建Socket对象,向Server的监听端口请求; b通过向新Socket中读写数据与Server端通信; c关闭Sock
13、et,结束与Server端; (2)服务器端的编程流程:1打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指 定端口为客户端请求的Socket 服务;2 等待来自客户端的Client端的请求; 3接收Client端的请求,用返回的Socket建立连接; 4通过向Socket中读写数据来与Client端通信; 5关闭Socket,结束与当前Client端的通信; 6关闭SerketSocket对象结束监听服务。3.2.2 具体流程描述如下图所示: 服务端ServerSocket(port)创建ServerSocket对象,提供TCP连接服务 客户端Sock
14、et(host,port)创建Socket对象向指定主机端口发连接请求accept()在指定端口等待客户端连接请求 申请连接连接成功获得一个已连接的Socket对象 建立Socket连接InputStream读取Socket对象的输入流InputStream读取Socket对象输入流 通过流传数据OutputStream写入Socket对象的输出流OutputStream写入Socket对象输出流Socket.close()关闭TCP连接Socket.close()关闭TCP连接ServerSocket.close()停止提供TCP连接服务 图3-2 TCP Socket流程描述图3.3 多线
15、程编程技术3.3.1 进程及线程概述进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变
16、量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。3.3.2 java对多线程编程的支持 Java对多线程的支持是非常强大的,他屏蔽掉了许多的技术细节,让我们可以轻松的开发多线程的应用程序。Java里面实现多线程,有2个方法 1 继承 Thread类class MyThread extends Thread publ
17、ic void run() / 这里写上线程的内容 public static void main(String args) / 使用这个方法启动一个线程 new MyThread().start(); 2 实现 Runnable接口class MyThread implements Runnable public void run() / 这里写上线程的内容 public static void main(String args) / 使用这个方法启动一个线程 new Thread(new MyThread().start(); 3.4 用户界面设计在能够完全满足软件所需功能,设计界面要清爽
18、、操作要简单易懂的基本原则下,本软件的界面设计如下: 图3-3 用户界面4 系统流程与实现4.1 服务器模块详细设计 服务器模块由两个类构成:ChatServer类和Server类。类结构如下: 图4-1 服务器端主框架模块图其中红色空心方块的为类私有属性,绿色实心圆为类公共函数。在主类ChatServer类中服务端的具体工作就是首先创建一个ServerSocket对象,然后将该套接字绑定到本地主机的某一个固定的端口上,在本程序中选择了5000端口。接着在此端口等待客户端连接请求,连接成功后创建一个Socket对象用于获得一个已连接的Socket对象。ServerSocket service
19、= new ServerSocket(5000);Socket s =service.accept();然后创建一个Server类实例,并开始执行服务线程Server sTread = new Server(Socket s,ChatServer server);sTread.start();Server类主要用于Socket通信,主要代码如下:class Server extends Thread implements java.io.Serializable public void run()try output = new ObjectOutputStream(s.getOutputSt
20、ream();input = new ObjectInputStream(s.getInputStream();while(true)Object o = input.readObject();/接收客户端输入流Message message = (Message)o;if(init)chatname = (Message)o).getSend_user();/获取发送名server.addUser(chatname);/添加一个用户并更新用户列表server.sendList();init = false;if(message.getRec_user()=null)server.sendBy
21、All(message,this);/群聊信息写入输出流到客户端elseserver.sendByOne(message);/私聊信息写入输出流到客户端 catch (Exception e) server.remove(chatname,this);/注销用户并更新用户列表return ;其中,群发与私发以及用户列表更新方法如下:public void sendByAll(Message mess,Server s)for(int i = 0; i clients.size(); i+)Server temp = (Server)clients.get(i);if(temp!=s)/发送信息
22、给除请求客户端的其他用户temp.sendmessage(mess);public void sendByOne(Message mess)for(int i = 0; i users.size(); i+)if(users.get(i).equals(mess.getRec_user()/循环用户列表,匹配接收用户(Server)clients.get(i).sendmessage(mess);public void sendList()for(int i=0;iclients.size();i+)Server temp = (Server)clients.get(i);temp.sendm
23、essage(users.toArray();/ 发送用户列表数组对象到客户端4.2 客户端模块详细设计 客户端大纲视图如下:图4-2 客户端大纲视图 客户端设计主要涉及界面设计与Socket通信以及其他相关功能 其中界面设计主要继承自JFrame,还包含了JTextArea、JComboBox、JButton、JPanel、JScrollPane、JLabel、JList、ActionListener、JColorChooser、JOptionPane这些组件。由这些组件及相关方法共同构筑了客户端用户界面。设置默认外观、字体、背景色、聊天快捷模板、登录验证等功能均在这些组件基础上实现。 So
24、cket通信主要代码如下:1)接收服务器输入流模块(包含更新用户列表功能):while(true)tryObject o = input.readObject();/从 ObjectInputStream 读取对象if(o instanceof Object)/服务器返回用户列表this.lst_users.removeAll();/ 从此容器中移除所有组件this.lst_users.setListData(Object)o);/重新设置列表框数据项this.validate();/使用 validate 方法会使容器再次布置其子组件else if(o instanceof Message)
25、/服务器返回消息类show.append(o+n);/ o.toString(),注意Message类中重写的toString()方法elsethrow new Exception(系统出现严重错误);catch(Exception e)e.printStackTrace();return;2) 写入输出流到服务器模块(包含私聊、群聊、脏话过滤功能):String message = send.getText().trim(); /trim()方法,返回字符串的副本,忽略前导空白和尾部空白。/群聊if(!message.equals()&lst_users.getSelectedIndex()
26、=-1)/如果发送消息区域不为空,并且没有选择用户列表if(message.equals(tmd)|message.equals(日)|message.equals(草)|message.equals(妈的)|message.equals(shit)message = *;sendmessage(message);/把发送的字符串写入输出流show.append(我说:n+message+n);send.setText();/,点击发送后,发消息区域置空/私聊else if(!message.equals()&lst_users.getSelectedIndex()!=-1&!chatname
27、.equals(lst_users.getSelectedValue()Object o = lst_users.getSelectedValue();/返回所选的第一个值,即获取私聊对象if(message.equals(tmd)|message.equals(日)|message.equals(草)|message.equals(妈的)message = *;sendmessage(message,o.toString();show.append(我私下对+lst_users.getSelectedValue()+说:n+message+n);send.setText();else if(
28、chatname.equals(lst_users.getSelectedValue()show.append(不能自言自语哦!.n);send.setText();其他相关功能主要代码如下:上下线提醒:public void run()sendmessage(我上线了);btn_close.addActionListener(new ActionListener()/点击“关闭”按钮事件public void actionPerformed(ActionEvent e)sendmessage(我下线了);try finalize(); catch (Throwable e1) e1.prin
29、tStackTrace();System.exit(0););登录验证:String username = javax.swing.JOptionPane.showInputDialog(请输入用户名:);while(username.length()=0)username = javax.swing.JOptionPane.showInputDialog(用户名不能为空,请重新输入!);聊天快捷模板:btn5.addActionListener(new ActionListener()/设置快捷聊天语public void actionPerformed(ActionEvent e) Obj
30、ect o = btn5.getSelectedItem();sendmessage(String)o);show.append(我说:n+(String)o+n););4.3 MessageBean详细设计开发个Message类来封装打包和解包消息的方法(项目中开发Message.java),方便调用public class Message implements java.io.Serializableprivate String send_user;private String rec_user;private String content;public Message(String se
31、nd_user,String content)this.send_user = send_user;this.content = content;public Message(String send_user,String rec_user,String content)this.send_user = send_user;this.rec_user = rec_user;this.content = content;public String toString()/重写了toString方法if(rec_user = null)return send_user+说:n+content;els
32、ereturn send_user+私下对+rec_user+说:n+content;public String getSend_user()return send_user;public void setSend_user(String send_user)this.send_user = send_user;public String getRec_user()return rec_user;public void setRec_user(String rec_user)this.rec_user = rec_user;public String getContent()return co
33、ntent;public void setContent(String content)this.content = content;5 系统测试与分析运行截图并分析登录验证:上线验证:下线验证:聊天模板验证:脏话过滤验证: 私聊验证(选择相应用户可以进行私聊):群聊验证(选择群发按钮,将会取消对具体用户的选择,从而实现群聊):结 论在当今电脑网络密布的世界当中,一个简单高效的局域网通信工具是如此的具有实用性,所以我们应当重视对它的相关研究与开发。系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。系统虽然完成,但是距离优秀仍存在一定差距。希望自
34、己能不断学习和实践,争取以后做得更好。 本次课程设计涉及到了java利用Socket的网络通信和图形用户界面GUI的设计以及JAVA多线程技术。使我不仅对网络知识有进一步的提高,而且对JAVA的图形用户界面的设计和多线程技术以及Socket网络通信技术有进一步的掌握和新的见解。特别是在对程序的调试过程中,获得的经验更为可贵,不仅使我充分认识到自己的不足之处,而且通过调试改变了许多以往错误的观点,使我对知识的掌握更加牢固,而且还锻炼了自己的动手能力以及解决问题的能力,这是十分可贵的。参考文献1 杨瑞龙.Java程序设计之网络编程.清华大学出版社.2008.第5次印刷2 马骏.Java程序设计实用教程(第三版).电子工业出版社.2010第 15 页 共 20 页