多人聊天室设计毕业论文Word文档下载推荐.docx
《多人聊天室设计毕业论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多人聊天室设计毕业论文Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
4.视频聊天:
聊天双方在有视频的基础上,可以通过视频来进行“面对面”的聊天;
2.2系统所用技术
2.2.1Java技术
Java是Sun公司于1995年推出的程序设计语言。
Java分为三个体系J2SE(Java平台标准版)、J2EE(Java平台企业版)和J2ME(Java平台微型版)。
Java语言之所以发展这么迅速,主要在于它跨平台、开源,在Java里面很多项目都是开源的,就像Linux一样,也可以说是开源推动了它的进一步发展。
Java在现在依然是很火的一门编程语言,主要在于它有如下特点:
1.Java语言是简单的。
它相对于C或C++来说比较简单,它丢掉了C或C++里面的指针。
2.它是面向对象的。
在Java中可以认为万事万物皆对象。
3.Java语言是分布式的。
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(javanet),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。
Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
4.Java语言也是动态的。
Java语言的设计目标之一是适应于动态变化的环境。
Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。
这也有利于软件的升级。
另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
2.2.2TCP/IP协议
TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP定义了电子设备(比如计算机)如何连入因特网,以与数据如何在它们之间传输的标准。
TCP/IP是一个四层的分层体系结构。
高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。
低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。
在多人聊天室中则是在这种协议基础上实现的彼此之间的信息交流;
2.2.3JMF使用RTP协议
实时传输协议RTP(Real-TimeTransportProtocol)是针对Internet上多媒体数据流的一个传输协议,由IETF(Internet工程任务小组)作为RFC1889发布。
RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。
RTP的典型应用建立在UDP上,但也可以建立在TCP或ATP等其它协议之上工作。
RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。
在多人聊天室中则是在这种通信协议的基础上实现的视频聊天;
2.2.4Mysql数据库
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
并且其速度、可靠性和适应性都非常不错,而且还有可视化的插件,便于建表和进行其它的操作。
多人聊天室中利用这种数据库实现的数据保存;
2.3系统运行环境
硬件环境:
个人计算机(内存1G+)
软件环境:
Eclipse3.3、JDK1.6、Mysql5.0、WindowsXP
第3章系统分析
3.1关于系统分析
3.1.1可行性分析
本软件在计算机语言上采用的是当前流行的Java语言,这种语言具有很好的跨平台性,可以对不同的操作系统进行兼容,只需要用户的电脑上将有SUN公司开发的JDK1.4以上的版本就可以运行该程序;
编辑器利用是Eclipse,这种编辑器具有很好的提示功能,支持插件,使用相当方便;
数据库利用的是Mysql,这种数据库易于安装,所占的空间少,启动快,适合在局域网;
该软件只需要一台将有JDK1.4以上版本的电脑即可,经济上实惠;
由于电脑技术的发展,人们素质的提高,对于电脑的基本操作和维护都有了一定的基础,因此在维护上还是不成问题;
3.2系统功能分析
3.2.1客户端功能分析
在客户端我们根据软件的需要可以从它所应具有的界面个数来对它的功能进行分析;
第一个登录界面
在这个界面上,有两个输入框一个是账号,一个是密码;
当输入完信息之后,点击登录按钮,客户端就会开始与服务器与行连接;
在这个过程中要完成两件事情。
一件是,客户端取得与服务器的连接,如果服务器没有开启或者网络不通,自然要给客户端一个友好的提示信息;
另一件是,取得连接之后客户端将账号与密码信息发送给服务器,以确保该用户是否存在,如果不存在则提示账号或者密码错误,存在则进入下一个界面,进度条则会显示整个处理的进度情况;
第二个用户列表界面
这个界面是用户成功登录之后,展现该用户自己信息与所有好友信息的界面,这是每一个用户都必须有的界面,只有退出整个程序时这个界面才会消息;
在这个界面上提供给用户进行操作的则是,用户可以根据自己的喜爱选择好友列表中相应的好友,双击头像图标进行聊天;
第三个聊天窗口
这是整个多人聊天室的主要界面;
这在这界面上负责将自己的消息通过发达信息框发送给对方,并将对方的信息显示在信息显示框内;
另外这个窗口还有相应的功能按钮提供给用户一些方便的操作。
例如抖动按钮,发送按钮,视频聊天选项等;
点击视频聊天选项会出现相应的视频聊天窗口,点击发送按钮会将消息发送出去,点击抖动按钮会使聊天对方的聊天窗口出现一段时间的抖动;
3.2.2服务器功能分析
服务器的主要功能则是将客户端发送过来的信息,进行验证和转发,服务器处理的工作较多,要求性能较好;
在服务器端主要有一个界面,这个界面负责启动服务器,并且在服务器启动之后,会将所有存在的用户信息包括账号、密码、头像等信息显示在表格上,以方便后台的人员对用户进行相应的操作;
另外所有用户发送给客户端的信息都会在信息显示框内进行显示,以便查看整个通信过程;
3.3系统流程图
为了更清楚地说明系统框架,以便更好地说明设计该系统的解决方案,我们给出了系统流程图,如图3.1。
系统流程图展示了该系统客户端与服务器之间的逻辑关系,其中主要介绍的是服务器如何处理消息的一个过程,并将在下面的的系统设计阶段给出了相应的消息设计(XMPP)。
图3.1
由上图可以看出,一个客户端只要能过了账号、密码的验证就可以与其它相应的客户端取得联系,进行彼此之间的交流。
而服务器为了单独处理第个客户端则利用了多线程技术,使得每个客户端的信息不至于混乱;
第4章系统设计
4.1数据库表设计
user表:
id
整型
唯一ID
name
字符型
用户名
account
账号
password
密码
picture
头像
friends表:
通过friends表可以找到某个用户的所有朋友信息
id_user
外键
type
朋友类型
friend_account
朋友账号
4.2自定义XMPP协议
1------>
客户端与服务器连接
a.没有连接上则返回超时,
b.连接上
密码错误则进行提示
正确则返回个人信息、用户列表并进入用户窗口
1-1.登录请求
<
msg>
type>
login<
/type>
account>
账号<
/account>
pwd>
密码<
/pwd>
/msg>
1-2.登录应答
login_response<
state>
1表示成功,0表示失败<
/state>
1-3.发送个人信息
<
user<
name>
用户名<
/name>
用户账号<
picture>
用户头像<
/picture>
1-4.发送好友队列信息---默认2个组
好友类型<
好友名<
好友账号<
好友头像<
2.聊天
彼此在线,好友发送消息过来时,弹出对应的聊天框
2-1.<
chat<
myaccount>
本人账号<
/myaccount>
friendaccount>
朋友账号<
/friendaccount>
content>
内容<
/content>
对方不在线时,给发送者提示
2-2.<
line<
-1<
不在线好友账号<
3.抖动
点击抖动按钮则可以让对方的聊天框出现一段时间的抖动,条件是该好友要在线
3-1.<
shake<
发送方账号<
接收方账号<
4.视频
4-1视频请求(点击开始视频按钮)
vidio<
session>
发送者的ip,port<
4-2视频应答(点击接受按钮)
r_vidio<
第5章系统实现
5.1客户端实现
5.1.1登录界面
关键代码:
privatevoidcreatFrame(){
this.setTitle("
QQ2011"
);
this.setSize(340,250);
//三个panel--加中一个布局管理器给图片定位
JPanelpan1=newJPanel(newjava.awt.FlowLayout(0,0,0));
JPanelpan2=newJPanel();
JPanelpan3=newJPanel(newjava.awt.FlowLayout(0,10,3));
//pan2上的三个jpanel
JPanelpan4=newJPanel();
JPanelpan5=newJPanel();
JPanelpan6=newJPanel();
//pan1上的标签---要标签上加一张图片
JLabellab1=newJLabel();
javax.swing.ImageIconimg1=newjavax.swing.ImageIcon(
"
images//login1.jpg"
lab1.setIcon(img1);
//在三个jpanel上设图片和背景
pan1.add(lab1);
pan2.setBackground(newjava.awt.Color(228,244,255));
pan3.setBackground(newjava.awt.Color(194,255,250));
//设组件
JLabelname_label=newJLabel("
账号:
"
name_label.setFont(newjava.awt.Font("
宋体"
Font.TRUETYPE_FONT,12));
text=newJTextField(15);
JLabelreg_label=newJLabel("
注册账号"
reg_label.setFont(newjava.awt.Font("
JLabelpwd_label=newJLabel("
密码:
pwd_label.setFont(newjava.awt.Font("
pwd=newJPasswordField(15);
JLabelmod_label=newJLabel("
修改密码"
mod_label.setFont(newjava.awt.Font("
//进度条
JProgressBarbar=newJProgressBar();
JProBarprob=newJProBar(bar);
//启动进度条
prob.start();
bar.setBackground(Color.red);
JLabelbar_label=newJLabel("
"
JButtonset_bt=newJButton("
设置"
set_bt.setSize(60,5);
set_bt.setFont(newjava.awt.Font("
JLabelempty_label=newJLabel(
//给登录按钮、密码输入框注册侦听器
JButtonlog_bt=newJButton("
登录"
LoginButtonListenerlistener=newLoginButtonListener(this);
log_bt.addActionListener(listener);
pwd.addActionListener(listener);
log_bt.setSize(60,5);
log_bt.setFont(newjava.awt.Font("
//将组件加到pan4,pan5,pan6,pan3上
pan4.add(name_label);
pan4.add(text);
pan4.add(reg_label);
pan5.add(pwd_label);
pan5.add(pwd);
pan5.add(mod_label);
pan6.add(bar);
pan6.add(bar_label);
pan3.add(set_bt,BorderLayout.WEST);
pan3.add(empty_label,BorderLayout.CENTER);
pan3.add(log_bt,BorderLayout.EAST);
//pan4,pan5,pan6加到pan2上
pan2.add(pan4,BorderLayout.NORTH);
pan2.add(pan5,BorderLayout.CENTER);
pan2.add(pan6,BorderLayout.SOUTH);
//三个jpanel的位置北中
this.add(pan1,BorderLayout.NORTH);
this.add(pan2,BorderLayout.CENTER);
this.add(pan3,BorderLayout.SOUTH);
this.setDefaultCloseOperation(3);
//关闭窗口时退出运行
this.setLocationRelativeTo(null);
//位于窗口的中间
this.setVisible(true);
//可视
this.setResizable(false);
//设定窗口不可改变大小
}
5.1.2用户列表界面
privateJTreegetJTree0(){
if(jTree0==null){
jTree0=newJTree();
DefaultTreeModeltreeModel=null;
{//根结点
DefaultMutableTreeNoderoot=newDefaultMutableTreeNode("
好友列表"
//根据好友列表建树
//第一层,好友类型
for(inti=0;
i<
2;
i++){
DefaultMutableTreeNodenode1=newDefaultMutableTreeNode(
data[i][0]);
//第二层,好友名字
for(intj=0;
j<
1;
j++){
DefaultMutableTreeNodenode2=newDefaultMutableTreeNode(
data[i][1]);
node1.add(node2);
}
root.add(node1);
}
//表模型
treeModel=newDefaultTreeModel(root);
}
//给叶节点加上图片
ImageIconimage=newImageIcon("
images/163.gif"
DefaultTreeCellRendererrenderer=newDefaultTreeCellRenderer();
renderer.setLeafIcon(image);
jTree0.setCellRenderer(renderer);
//给节点加上双击事件
jTree0.addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
if(e.getClickCount()==2){
//点击路径
TreePathpath=jTree0.getPathForLocation(e.getX(),e
.getY());
//根据路径得到节点
TreeNodenode=(TreeNode)path.getLastPathComponent();
//叶节点1
if((node.toString()).equals(data[0][1])){
if(frame==null){
frame=newChatFrame(1,data,per,session);
}
}
//叶节点2
if((node.toString()).equals(data[1][1])){
if(frame2==null){