《Java课程设计聊天室(含代码)(50页).doc》由会员分享,可在线阅读,更多相关《Java课程设计聊天室(含代码)(50页).doc(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-Java课程设计聊天室(含代码)-第 46 页 Java程序课程设计任务书JAVA聊天室的系统的设计与开发1 主要内容:用JAVA实现基于C/S模式的聊天室系统。聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。2.用户可以配置服务器端的侦听端口,默认端口为8888。3.向已经连接到服务器端的用户发送系统消息。4.统计在线人数。5.当停止服务时,断开所有的用户连接。B.客户端的主要功能如下:1.连接到已
2、经开启聊天服务的服务器端。2.用户可以配置要连接的服务器端的IP地址和端口号。3.用户可以配置连接后显示的用户名。4.当服务器端开启的话,用户可以随时登录和注销。5.用户可以向所有人或某一个人发送消息。学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。3.进度安排:12月28日 12月29日:课程设计选题,查找参考资料 12月30日 1月1日: 完成系统设计1月2日 1月5日: 完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4. 主要参考文献:1.张广彬 孟红蕊 张永宝.Java课程
3、设计(案例精编)M.清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。 一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server200
4、0完成并通过JDBC-ODBC桥访问数据库。本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。使用JAVA语言编写,开发工具采用Eclipse。服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。大大增强了程序对服务器资源的利用。聊天系统完成后将可进行多人对多人的聊天,对好友进行添加、删除,对新用户的注册,发送消息、接受消息等等功能。关键词:多线程 ;客户机/服务器 ;JAVA ; Socket ; Eclipse ; TCP/IP目
5、 录JAVA程序课程设计任务书II摘要III目 录IV第1章 引言11.1 背景11.2 课程设计内容11.3 任务分工2第2章 聊天室系统32.1 聊天室系统概述32.1.1 聊天室系统的定义32.1.2 聊天室系统的任务及目的32.2 主要聊天室系统介绍42.3 本章小结5第3章 聊天室系统的设计63.1 系统需求分析63.2 系统开发及运行环境63.3 系统主要功能要求63.4 系统模块化分析73.4.1 聊天室系统总体结构73.4.2 聊天室系统各模块介绍83.5 系统数据流图103.6 本章小结10第4章 系统的具体实现114.1界面设计114.1.1服务器启动界面图114.1.2服
6、务器启动成功界面图124.1.3客户端界面图124.1.4用户设置界面图134.1.5用户成功登录界面图134.1.6两人私聊界面图144.1.7多人群聊界面图144.2程序设计及调试运行144.2.1 程序调试(以服务器为例)154.2.2 JCreator204.3 本章小结21第5章 结束语22致谢23附录 源代码24第1章 引言1.1 背景当今主流的聊天工具有QQ,ICQ,MSN Messenger,Yahoo Messenger等,国内最热门的当属QQ,腾讯QQ(OICQ)是由深圳市腾讯计算机系统公司开发的,基于Internet的即时寻呼软件。您可以使用QQ和好友用户进行交流,信息即
7、时发送,即时回复,收发及时、功能全面。此外QQ还具有BP机网上寻呼、聊天室、传输文件、语音邮件、手机短讯服务等功能,QQ不仅仅是虚拟的网络寻呼机,更可与传统的无线寻呼网、GSM移动电话的短消息系统互联,目前QQ和全国多家寻呼台、移动通信公司有业务合作。是国内不可多得的中文网络寻呼机。QQ支持显示朋友在线信息、即时传送信息、即时交谈、即时发送文件和网址。QQ可以在Win95/98/NT/2000操作系统下运行,是十分灵活的网络寻呼工具。它会自动检查您是否已联网,如果您的电脑已连入Internet,可以搜索网友、显示在线网友,可以根据QQ号、昵称、姓名、email地址等关键词来查找,找到后可加入到
8、通讯录中。当您的通讯录中的网友在线时,QQ中朋友的头像就会显示在线,根据提示就可以发送信息,如果对方登记了寻呼机或开通了GSM手机短消息,即使离线了,您也可及时将信息传递给您的好友。虽然以上这些软件是免费的,并且功能越来越强大。但是它们的唯一的不足就是必须要联网或者下载到它们的服务端,要不然是没法脱离Intenet使用的。为了能在一个没有连接到Intenet的局域网使用聊天工具,那就必须要有服务器端。本系统就是包括服务器端与客户端,可以在局域网聊天的一个工具。1.2 课程设计内容实现的是局域网中的聊天功能,运行服务程序后,服务器创建成功,然后使服务器对某一个设定的端口处于监听状态,当有客户端请
9、求建立连接时,服务器就可接受请求,建立连接!这样服务器和客户端就可相互发送消息,实现聊天功能!系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。2.用户可以配置服务器端的侦听端口,默认端口为8888。3.向已经连接到服务器端的用户发送系统消息。4.统计在线人数。5.当停止服务时,断开所有的用户连接。B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。2.用户可以配置要连接的服务器端的IP地址和端口号。3.用户可以配置连接后显示的用户名。4.当服务器端开启的话,用户可以随时登录和注销。5.用户可以向所有人或某一个人发送消息1.3 任务分工第2章 聊天
10、室系统2.1 聊天室系统概述聊天室是一种基于互联网的即时交流系统,最初是ICQ,也称网络寻呼机。此类软件使得人们可以运用连上INTERNET网的电脑用户可以随时跟另外一个在线网民交谈,甚至可以通过视频看到对方的适时图像。使人们不必担心昂贵的话费而畅快交流,并工作、交流两不误。2.1.1 聊天室系统的定义聊天时系统是通过即时通讯技术来实现在线聊天、交流的软件。目前有2种架构形式,1、一种是C/S架构,采用客户端/服务器形式,用户使用过程中需要下载安装客户端软件,典型的代表有:QQ、百度HI 、Skype QQ VS GU、Gtalk、新浪UC、MSN等;2、采用B/S架构,即浏览器/服务端形式,
11、这种形式的即时通讯软件,直接借助互联网为媒介、客户端无需安装任何软件,既可以体验服务器端进行沟通对话,一般运用在电子商务网站的服务商,典型的代表有Websitelive 、53KF、live800等。2.1.2 聊天室系统的任务及目的本系统主要通过客户端,服务器端来体现聊天系统的基本功能。(1)服务器端1.处理用户注册2.处理用户登录3.处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容4.处理用户得到信息5.处理用户退出8. 服务器踢人。9. 保存服务器日志。 10.保存用户聊天信息。(2)客户端 1.用户注册界面及结果2.用户登录界面及结果3.用户发送信息界面及结果4.用户得到信息界
12、面及结果5.用户退出界面及结果2.2 主要聊天室系统介绍目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为Live Messenger)以及跨平台Gaim等。本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。腾讯的成功与其对QQ的不断创新和完善是分不开的。参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。可以确定
13、腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。其模型如图1-1图1-1 腾讯QQ服务器-客户端模型1与腾讯QQ不同,微软的MSN Messenger只使用了TCP作为传输层通信协议,所有客户端与服务器进行连接,然后通过与服务器的TCP连接进行中转通信。其模型如图1-2图1-2 MSN服务器-客户端模型2腾讯使用的模型中,服务器主要处理客户端各种状态的控制,可以极大减轻服务器的处理压力,但其内部协议和实现复杂度都较高。而MSN Messenger所有数据都要经过服务器,服务器压力可想而知(难怪平时很少
14、见到使用MSN进行语音视频聊天的)。2.3 本章小结这一章介绍了当前聊天室系统应该具备的功能模块,并提供了市面上比较流行的聊天室系统作为参考。在这一章中,我们可以了解什么是聊天室系统,当前聊天室系统的市场需求,还有一个聊天室系统应该的开发目标。第3章 聊天室系统的设计这一章是聊天室系统的设计,从系统需求分析开始,介绍开发环境和用到的开发工具,系统主要的功能设计,系统的数据流程图。3.1 系统需求分析聊天室的设计目标:通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用,用JAVA实现基于C/S模式的聊天室系统。3.2
15、系统开发及运行环境硬件平台:q CPU:Pentium 2.8GHz以上。q 内存:256MB以上。软件平台:q 操作系统:Windows XP。q 运行环境:JDK Version1.6 JCreator。 3.3 系统主要功能要求本系统针对局域网进行联机聊天。聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。本系统主要实现如下功能:服务器:q 在特定端口上进行侦听,等待客户端连接。q 用户可以配置服务器端的侦听端口,默认端口为8888。q 向已经连接到服务器端的用户发送系统消息。q 统计在线人数。q 当停止服务时,
16、断开所有的用户连接。q 系统运行稳定、安全可靠。q 一台主机只能启动一个服务器。客户端:q 连接到已经开启聊天服务的服务器端。q 用户可以配置要连接的服务器端的IP地址和端口号。q 用户可以配置连接后显示的用户名。q 用户可以更改聊天时的表情。q 当服务器端开启后,用户可以随时登录和注销。q 用户可以向所有人或某一个人发送消息。q 系统运行稳定、安全可靠。q 可以默认连接到自己主机启动的服务器。3.4 系统模块化分析3.4.1 聊天室系统总体结构主要功能框架如下图所示:系统消息连接设置退出注销发送消息登录用户设置客户端启动服务退出停止服务端口设置服务器各功能模块实现的功能为:服务器:端口设置:
17、设置倾听的端口号,默认为8888。启动服务:开启倾听端口,允许客户端连接。系统消息:服务器启动后可以在聊天室内发送消息。停止服务:关闭倾听端口,中断所有客户端的连接。退出:关闭服务器。客户端:用户设置:设置聊天时显示的名称,默认为匆匆过客。连接设置:设置要连接的服务器所在主机的IP地址和倾听端口。登录:连接服务器。发送消息:进行聊天,可单独发送消息给聊天室中的一个人。注销:与服务器断开连接。退出:关闭客户端。3.4.2 聊天室系统各模块介绍服务器包含服务、帮助、聊天三大模块,其中服务模块包含端口设置、启动服务、停止服务和退出四个小模块聊天模块可以向聊天室内所有人或个人发送系统消息或以管理员身份
18、与其他人聊天表3-1 服务器各模块名称功能汇总表序号模块名基本功能1端口设置设置倾听的端口号,默认为8888。2启动服务开启倾听端口,允许客户端连接。3停止服务关闭倾听端口,中断所有客户端的连接。4退出关闭服务器。5帮助显示各个模块的功能及操作方法。6发送向聊天室内发送系统消息。客户端包含操作、设置、帮助、聊天四大模块,其中操作包含用户登录、用户注销和退出三个小模块,设置包含用户设置和连接设置两个小模块聊天模块除 具备普通聊天功能外,还能进行聊天时的表情选择表3-2 客户端各模块名称功能汇总表序号模块名基本功能1用户设置设置聊天时显示的名称,默认为匆匆过客。2连接设置设置要连接的服务器所在主机
19、的IP地址和倾听端口。3用户登录连接到服务器端。4用户注销与服务器断开连接。5退出关闭客户端。6发送发送聊天内容7悄悄话聊天内容不会被服务器和说话对象以外的人看到3.5 系统数据流图悄悄话客户端A客户端E客户端D客户端C客户端B服务器系统数据流图3.6 本章小结本章是聊天室系统的具体设计过程,有具体的需求分析、系统功能模块、系统数据流图。这里我们开始接触聊天室系统开发的最初步骤,也是很重要的一步。第4章 系统的具体实现界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量, 并在很大程度上决定了软件是否成功。4.1界面设计4.1.1服务器启动界面图4.1.2服务器启动成功界面图4.1
20、.3客户端界面图4.1.4用户设置界面图4.1.5用户成功登录界面图4.1.6两人私聊界面图4.1.7多人群聊界面图4.2程序设计及调试运行利用JCreator“一次编写,各处运行”的编程优点,按功能模块结构设计菜单,布置各明细模块工作界面,编写各个模块的程序代码,进行编译连接运行,经过反复调试修改,以达到系统功能要求。这个过程具有大量的工作量,应仔细对每个程序细节进行分析思考、编写程序并调试,做到程序简洁清楚,尽量避免可能潜在的程序错误,并在必要的地方加以注释,以便于程序阅读和修改。4.2.1 程序调试(以服务器为例) import java.awt.*;import java.awt.ev
21、ent.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*; * 聊天服务端的主框架类public class ChatServer extends JFrame implements ActionListenerpublic static int port = 8888;/服务端的侦听端口ServerSocket serverSocket;/服务端SocketImage icon;/程序图标JComboBox combobox;/选择发送消息的接受者JTextArea messageShow
22、;/服务端的信息显示JScrollPane messageScrollPane;/信息显示的滚动条JTextField showStatus;/显示用户连接状态JLabel sendToLabel,messageLabel;JTextField sysMessage;/服务端消息的发送JButton sysMessageButton;/服务端消息的发送按钮UserLinkList userLinkList;/用户链表/建立菜单栏JMenuBar jMenuBar = new JMenuBar(); /建立菜单组JMenu serviceMenu = new JMenu (服务(V); /建立菜
23、单项JMenuItem portItem = new JMenuItem (端口设置(P);JMenuItem startItem = new JMenuItem (启动服务(S);JMenuItem stopItem=new JMenuItem (停止服务(T);JMenuItem exitItem=new JMenuItem (退出(X);JMenu helpMenu=new JMenu (帮助(H);JMenuItem helpItem=new JMenuItem (帮助(H);/建立工具栏JToolBar toolBar = new JToolBar();/建立工具栏中的按钮组件JBu
24、tton portSet;/启动服务端侦听JButton startServer;/启动服务端侦听JButton stopServer;/关闭服务端侦听JButton exitButton;/退出按钮/框架的大小Dimension faceSize = new Dimension(400, 600);ServerListen listenThread;JPanel downPanel ;GridBagLayout girdBag;GridBagConstraints girdBagCon; * 服务端构造函数public ChatServer()init();/初始化程序/添加框架的关闭事件处
25、理this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();/设置框架的大小this.setSize(faceSize);/设置运行时窗口的位置Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - faceSize.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2);this
26、.setResizable(false);this.setTitle(聊天室服务端); /设置标题/程序图标icon = getImage(icon.gif);this.setIconImage(icon); /设置程序图标show();/为服务菜单栏设置热键VserviceMenu.setMnemonic(V);/为端口设置快捷键为ctrl+pportItem.setMnemonic (P); portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK);/为启动服务快捷键为ctrl+
27、sstartItem.setMnemonic (S); startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK);/为端口设置快捷键为ctrl+TstopItem.setMnemonic (T); stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK);/为退出设置快捷键为ctrl+xexitItem.setMnemonic (X); exitItem.setAccel
28、erator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK);/为帮助菜单栏设置热键HhelpMenu.setMnemonic(H);/为帮助设置快捷键为ctrl+phelpItem.setMnemonic (H); helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK); * 程序初始化函数public void init()Container contentPane = getContentPane();
29、contentPane.setLayout(new BorderLayout();/添加菜单栏serviceMenu.add (portItem);serviceMenu.add (startItem);serviceMenu.add (stopItem);serviceMenu.add (exitItem);jMenuBar.add (serviceMenu); helpMenu.add (helpItem);jMenuBar.add (helpMenu); setJMenuBar (jMenuBar);/初始化按钮portSet = new JButton(端口设置);startServe
30、r = new JButton(启动服务);stopServer = new JButton(停止服务 );exitButton = new JButton(退出 );/将按钮添加到工具栏toolBar.add(portSet);toolBar.addSeparator();/添加分隔栏toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();/添加分隔栏toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);/初始时,令停止服务
31、按钮不可用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.addActi
32、onListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this); combobox = new JComboBox();combobox.insertItemAt(所有人,0);combobox.setSelectedIndex(0);messageShow = new JTextArea();messageShow.setEditable(false);/添加滚动条messageScrollPane = new JScrollPane(messageShow,JScrollPane.
33、VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400);messageScrollPane.revalidate();showStatus = new JTextField(35);showStatus.setEditable(false);sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButto
34、n = new JButton();sysMessageButton.setText(发送);/添加系统消息的事件侦听sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(发送至:);messageLabel = new JLabel(发送消息:);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new
35、GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel( );girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx =
36、 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LI
37、NE_START;girdBag.setConstraints(combobox,girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagC
38、on.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gr
39、idx = 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(new WindowAdapter()public void windowClos
40、ing(WindowEvent e)stopService();System.exit(0); * 事件处理public void actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = startServer | obj = startItem) /启动服务端startService();else if (obj = stopServer | obj = stopItem) /停止服务端int j=JOptionPane.showConfirmDialog(this,真的停止服务吗?,停止服务,JOptionPa
41、ne.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口设置/调出端口设置的对话框PortConf portConf = new PortConf(this);portConf.show();else if (obj = exitButton | obj = exitItem) /退出程序int j=JOptionPane.showConfirmDialog(this,真的要退出吗?,退
42、出,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0);else if (obj = helpItem) /菜单栏中的帮助/调出帮助对话框Help helpDialog = new Help(this);helpDialog.show();else if (obj = sysMessage | obj = sysMessageButton) /发送系统消息sendSystemMessage(); * 启动服务端public
43、 void startService()tryserverSocket = new ServerSocket(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 (Exception e)/System.out.println(e);userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,combobox,messageS