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