1、java课设正文1 引言1.1 背景当今主流的聊天工具有QQ,ICQ,MSN Messenger,Yahoo Messenger等,国内最热门的当属QQ,腾讯QQ(OICQ)是由深圳市腾讯计算机系统公司开发的,基于Internet的即时寻呼软件。您可以使用QQ和好友用户进行交流,信息即时发送,即时回复,收发及时、功能全面。此外QQ还具有BP机网上寻呼、聊天室、传输文件、语音邮件、手机短讯服务等功能,QQ不仅仅是虚拟的网络寻呼机,更可与传统的无线寻呼网、GSM移动电话的短消息系统互联,目前QQ和全国多家寻呼台、移动通信公司有业务合作。是国内不可多得的中文网络寻呼机。QQ支持显示朋友在线信息、即时
2、传送信息、即时交谈、即时发送文件和网址。QQ可以在Win95/98/NT/2000操作系统下运行,是十分灵活的网络寻呼工具。它会自动检查您是否已联网,如果您的电脑已连入Internet,可以搜索网友、显示在线网友,可以根据QQ号、昵称、姓名、email地址等关键词来查找,找到后可加入到通讯录中。当您的通讯录中的网友在线时,QQ中朋友的头像就会显示在线,根据提示就可以发送信息,如果对方登记了寻呼机或开通了GSM手机短消息,即使离线了,您也可及时将信息传递给您的好友。虽然以上这些软件是免费的,并且功能越来越强大。但是它们的唯一的不足就是必须要联网或者下载到它们的服务端,要不然是没法脱离Intene
3、t使用的。为了能在一个没有连接到Intenet的局域网使用聊天工具,那就必须要有服务器端。本系统就是包括服务器端与客户端,可以在局域网聊天的一个工具。1.2 课程设计内容实现的是局域网中的聊天功能,运行服务程序后,服务器创建成功,然后使服务器对某一个设定的端口处于监听状态,当有客户端请求建立连接时,服务器就可接受请求,建立连接,这样服务器和客户端就可相互发送消息,实现聊天功能,系统的功能要求: 服务器端主要功能如下: (a)在特定端口上进行侦听,等待客户端连接。 (b)用户可以配置服务器端的侦听端口,默认端口为8086。 (c)向已经连接到服务器端的用户发送系统消息。 (d)统计在线人数。 (
4、e)当停止服务时,断开所有的用户连接。 客户端的主要功能如下: (a)连接到已经开启聊天服务的服务器端。 (b)用户可以配置要连接的服务器端的IP地址和端口号。 (c)用户可以配置连接后显示的用户名。 (d)当服务器端开启的话,用户可以随时登录和注销。 (e)用户可以向所有人或某一个人发送消息。2 聊天室系统2.1 聊天室系统概述聊天室是一种基于互联网的即时交流系统,最初是ICQ,也称网络寻呼机。此类软件使得人们可以运用连上INTERNET网的电脑用户可以随时跟另外一个在线网民交谈,甚至可以通过视频看到对方的适时图像。使人们不必担心昂贵的话费而畅快交流,并工作、交流两不误。2.1.1 聊天室系
5、统的定义聊天时系统是通过即时通讯技术来实现在线聊天、交流的软件。目前有2种架构形式,1、一种是C/S架构,采用客户端/服务器形式,用户使用过程中需要下载安装客户端软件,典型的代表有:QQ、XXHI 、Skype QQ VS GU、Gtalk、新浪UC、MSN等;2、采用B/S架构,即浏览器/服务端形式,这种形式的即时通讯软件,直接借助互联网为媒介、客户端无需安装任何软件,既可以体验服务器端进行沟通对话。2.1.2 聊天室系统的任务及目的本系统主要通过客户端,服务器端来体现聊天系统的基本功能,服务器功能为: (a)处理用户注册(b)处理用户登录(c)处理用户发送信息,服务器监控聊天内容,服务器过
6、滤非法内容(d)处理用户得到信息(e)处理用户退出 (f)服务器踢人。 客户端功能为:(a)用户注册界面及结果(b)用户登录界面及结果(c)用户发送信息界面及结果(d)用户得到信息界面及结果(e)用户退出界面及结果(f)用户修改密码界面2.2 主要聊天室系统介绍目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为Live Messenger)以及跨平台Gaim等。本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量
7、始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。腾讯的成功与其对QQ的不断创新和完善是分不开的。参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信;其模型如图2-1:图2-1 腾讯QQ服务器-客户端模型1与腾讯QQ不同,微软的MSN Messenger只使用了TCP作为传输层通信协议,所有客户端与服务器进行连接,然后通过与服务器的TCP连接进行中转通信。其模型如图2-2:图2-2 MSN服务器-客
8、户端模型2腾讯使用的模型中,服务器主要处理客户端各种状态的控制,可以极大减轻服务器的处理压力,但其内部协议和实现复杂度都较高。而MSN Messenger所有数据都要经过服务器,服务器压力可想而知(难怪平时很少见到使用MSN进行语音视频聊天的)。 2.3 本章小结这一章介绍了当前聊天室系统应该具备的功能模块,并提供了市面上比较流行的聊天室系统作为参考。在这一章中,我们可以了解什么是聊天室系统,当前聊天室系统的市场需求,还有一个聊天室系统应该的开发目标。3 聊天室系统的设计3.1 系统需求分析聊天室的设计目标:通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、ORCL等
9、开发工具的运用,拓宽常用类库的应用,用JAVA实现基于C/S模式的聊天室系统。3.2 本次系统开发及运行环境硬件平台: (a)CPU:Inter Core i3。 (b)内存:2G。软件平台: (a)操作系统:Windows 07。 (b)运行环境:JDK Version1.6 。 3.3系统模块化分析3.3.1 聊天室系统总体结构主要功能框架如下图所示:图3-1 主要功能框架图各功能模块实现的功能为:服务器: 端口设置:设置倾听的端口号,默认为8888。 启动服务:开启倾听端口,允许客户端连接。 系统消息:服务器启动后可以在聊天室内发送消息。 停止服务:关闭倾听端口,中断所有客户端的连接。
10、退出:关闭服务器。 客户端: 用户设置:设置聊天时显示的名称,默认为匆匆过客。 连接设置:设置要连接的服务器所在主机的IP地址和倾听端口。 登录:连接服务器。 发送消息:进行聊天,可单独发送消息给聊天室中的一个人。 注销:与服务器断开连接。 退出:关闭客户端。3.3.2 聊天室系统各模块介绍服务器包含服务、帮助、聊天三大模块,其中服务模块包含端口设置、启动服务、停止服务和退出四个小模块聊天模块可以向聊天室内所有人或个人发送系统消息或以管理员身份与其他人聊天。表3-1 服务器各模块名称功能汇总表序号模块名基本功能1端口设置设置倾听的端口号,默认为8888。2启动服务开启倾听端口,允许客户端连接。
11、3停止服务关闭倾听端口,中断所有客户端的连接。4退出关闭服务器。5帮助显示各个模块的功能及操作方法。6发送向聊天室内发送系统消息。客户端包含操作、设置、帮助、聊天四大模块,其中操作包含用户登录、用户注销和退出三个小模块,设置包含用户设置和连接设置两个小模块聊天模块除 具备普通聊天功能外,还能进行聊天时的表情选择。表3-2 客户端各模块名称功能汇总表序号模块名基本功能1用户设置设置聊天时显示的名称,默认为匆匆过客。2连接设置设置要连接的服务器所在主机的IP地址和倾听端口。3用户登录连接到服务器端。4用户注销与服务器断开连接。5退出关闭客户端。6发送发送聊天内容7悄悄话聊天内容不会被服务器和说话对
12、象以外的人看到3.4 系统数据流图图3-2 图系统数据流图3.5 本章小结本章是聊天室系统的具体设计过程,有具体的需求分析、系统功能模块、系统数据流图。这里我们开始接触聊天室系统开发的最初步骤,也是很重要的一步。4系统的具体实现界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量, 并在很大程度上决定了软件是否成功。4.1界面设计(a)服务器启动界面图图4-1 服务器启动界面图(b)服务器启动成功界面图图4-2 服务器启动成功界面图(c)客户端界面图图4-3 客户端登陆界面(d)用户成功登录界面图图4-4 用户成功登陆界面(e)两人私聊界面图图4-5 两人私聊界面图(f)添加删除好
13、友图4-6 客户端删除好友图图4-7 客户端添加好友图图4-8 添加好友成功图图4-9 添加删除好友界面图(g)注册账户图4-10 注册账户界面图图4-11 注册成功提示图图4-12 注册账户界面图4.2程序设计及调试运行按功能模块结构设计菜单,布置各明细模块工作界面,编写各个模块的程序代码,进行编译连接运行,经过反复调试修改,以达到系统功能要求。这个过程具有大量的工作量,应仔细对每个程序细节进行分析思考、编写程序并调试,做到程序简洁清楚,尽量避免可能潜在的程序错误,并在必要的地方加以注释,以便于程序阅读和修改。4.3 本章小结本章介绍了系统的具体实现和部分关键代码,其中包括用户登录所要用到的
14、函数和主界面的框架设计。5 设计体会及今后的改进意见 本文简单介绍了Java版的局域网聊天室,实现了局域网内的好友之间的聊天,删除添加好友,注册账号和服务器端的控制等功能。 此次功能的实现是很不易的,每一个功能模块的实现都话费了大量的时间和精力,正是由于这样,我对Java基础的理解和应用有了很大的提高,由于每个功能的实现的框架基本都是相同的,所以在前期的实现比较困难,但是在后期的编程还是相对比较简单,代码的编写是一个技术的问题更是一个时间的问题,我们只有通过不断的编程和调试才能写出更好的程序。 本次的局域网聊天中未能很好的完成用户信息的管理,在实现的方法上没有将多个线程包装成一个超类,所有从客
15、户端到服务器和服务器到客户端的信息只通过一个模型进行传输,在这方面我还是需要很好的理解多态处理机制。参 考 文 献1朱庆生.Java程序设计M.北京.清华大学出版社,20112王伟平.Java编程M.北京.清华大学出版社,20103叶乃文.Java核心技术M.北京.机械工业出版社,2009附录 1 包的设计主要源代码: /*客户端界面*/package com.lyz.view;import java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.BorderFactory;import javax.swing.Im
16、ageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextField;import com.lyz.controller.client.AddDelHandler;import com.lyz.controller.client.ClientFrameHandler;import com.lyz.controller.c
17、lientListener.AddDelListener;import com.lyz.controller.clientListener.ClientListener;import com.lyz.controller.clientListener.FriListListener;import com.lyz.controller.clientListener.LeaveMesListener;import com.lyz.controller.clientListener.MesListener;import com.lyz.controller.clientListener.TypeLi
18、stener;import com.lyz.controller.clientSend.SendMes;import com.lyz.model.FinalFile;import com.lyz.model.ParentModel;import com.lyz.util.ScreenSize;public class ClientFrame extends JFrame private FriPanel friPanel; private ParentModel pm; private FriListListener friListener; private MesListener mesLi
19、stener; private TypeListener typeListener; private LeaveMesListener leaveMesListener; private MyPanel pan; private JTextField choserJtf; private JLabel qqLab,addLab,picLab; private JButton delBut,addBut; private JPanel add_del_pan,topPan; public ClientFrame(ParentModel pm) super(客户端); /将用户模型传给登陆用户界面
20、 this.pm=pm; this.setBounds(ScreenSize.width-300,50,230,600); /添加好友面板 friPanel=new FriPanel(); this.add(new JScrollPane(friPanel),BorderLayout.CENTER); topPan=new JPanel(new BorderLayout(); topPan.setBounds(0,0,200,70); topPan.setBorder(BorderFactory.createEtchedBorder(); /显示图像 picLab=new JLabel();
21、topPan.add(picLab,BorderLayout.WEST); /显示QQ号 qqLab=new JLabel(); topPan.add(qqLab,BorderLayout.CENTER); /确认 addLab=new JLabel(); addLab.setToolTipText(双击确定); topPan.add(addLab,BorderLayout.EAST); this.add(topPan,BorderLayout.NORTH); add_del_pan=new JPanel(); add_del_pan.setBounds(5,500,200,70); add_
22、del_pan.setBorder(BorderFactory.createEtchedBorder(); /查询 choserJtf=new JTextField( ); choserJtf.setBounds(5,50,90,15); add_del_pan.add(choserJtf); addBut=new JButton(添加); addBut.setBounds(100,40,30,30); addBut.setContentAreaFilled(false); addBut.setFont(new java.awt.Font(宋体, 1, 13); add_del_pan.add
23、(addBut); delBut=new JButton(删除); delBut.setBounds(130,40,30,30); delBut.setContentAreaFilled(false); delBut.setFont(new java.awt.Font(宋体, 1, 13); add_del_pan.add(delBut); this.add(add_del_pan,BorderLayout.SOUTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); /添加离线信息监听器
24、 ClientFrameHandler ch=new ClientFrameHandler(this); this.addWindowListener(ch); /添加客户端监听 ClientListener clientListener=new ClientListener(this); clientListener.setDaemon(true); clientListener.start(); /添加好友监听器 AddDelHandler ah=new AddDelHandler(this); this.delBut.addActionListener(ah); this.addBut.
25、addActionListener(ah); this.addLab.addMouseListener(ah); /发送登陆信息 SendMes.sendServerMes(FinalFile.SER, pm); public void closeService() this.friListener.close(); this.typeListener.close(); this.mesListener.close(); this.leaveMesListener.close(); public class MyPanel extends JPanel public Dimension get
26、PreferredSize() return new Dimension(230,600); public void setReplyPic(boolean flag) if (flag=true) this.picLab.setIcon(new ImageIcon(image/add_mes.gif); else this.picLab.setIcon(new ImageIcon(image/recieved.gif); /*服务器端界面*/package com.lyz.view;import javax.swing.JFrame;import javax.swing.JLabel;imp
27、ort javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.TableModel;import com.lyz.controller.serverListener.AddDelFriListener;import com.lyz.controller.serverListener.MesListener;import com.lyz.controller.serverListener.RegistListener;import com.lyz.c
28、ontroller.serverListener.ServerListener;import com.lyz.model.dao.Dao;import com.lyz.util.ScreenSize;public class ServerFrame extends JFrame private JTable tab; private TableModel model; private JPanel typePanel; private JLabel typeLabel; private Dao dao=new Dao(); public ServerFrame() super(服务器端); t
29、his.setBounds(ScreenSize.width-400)/2,(ScreenSize.height-300)/2,400,300); tab=new JTable(); refreashModel();、 this.add(new JScrollPane(tab); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /线程-服务器监听 ServerListener serverListener=new ServerListener(this); serverListener.se
30、tDaemon(true); serverListener.start(); /* * 刷新表格数据 */ public void refreashModel() model=dao.getLoginTableModel();/ java.lang.NullPointerException-判断dao是否是空对象 this.tab.setModel(model); /*服务器端监听*/public class ServerListener extends Thread private ServerSocket server; private Socket sc; private boolean flag
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1