




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章绪论3选题背景3目的和意义3第2章系统概况4系统主要功能4系统所用技术42.2.1Java技术42.2.2TCP/IP协议52.2.3JMF使用RTP协议52.2.4Mysql数据库5系统运行环境6第3章系统分析6关于系统分析6可行性分析6系统功能分析6客户端功能分析63.2.2服务器功能分析7系统流程图7第4章系统设计9数据库表设计94.2自定义XMPP协议9第5章系统实现115.1客户端实现115.1.1登录界面115.1.2用户列表界面145.1.3聊天窗口及视频界面165.2服务器端实现215.2.1服务器界面21第6章结束语22参考文献23多人聊天室设计摘要:在信息时代的今天,进行信息交流已成为了人们日常生活中不可缺少的事情,但是由于手机话费的昂贵、发送手机短信的烦琐,以及它们之间由于不及时性而造成了相应的损失;网络通信软件由于安装方便、操作简单,更重要的是它给广大的用户提供了一个免费交流的平台,这个平台具有广域性、及时性、高效性,因此受到了许多公司、企业院校的青睐,特别是广大青年人的追捧;本论文介绍的就是一个基于TCP/IP协议、C/S模式、利用多线程、实现点对点通信的一个多人聊天室软件,可以进行私聊、群聊、视频聊天等;关键字:Java;聊天室;线程;协议;第1章绪论随着信息时代的到来,信息的交流量也与日俱增。尽管一些通信工具,例如手机,可以通过打电话或者发短信与对方进行相应的信息交流;但是对于大量的信息、长时间或者“面对面”的交流,手机则不能适应。网络通信软件,正是由于它的安装方便,只需要彼此之间都有连上网的电脑,安装有相应的客户端,就可以进行信息交流;并且它可以实现与一个人与多个不同国家、地方的人进行交流,交流的过程中可以传输大量的信息资料,更加的方便快捷,也无需过多的通信费用;甚至彼此之间还可以通信视频实现“面对面”的语音聊天,提供了更加亲舒适的服务;因此许多的公司、企业及院校都有相应的网络通信软件,进行日常的信息处理。特别受青少年追捧的网络通信软件就是腾讯公司的QQ,本论文所介绍的多人聊天室就是在腾讯QQ的基础上自己制作的一个实现了相应功能的网络通信软件;1.网络通信软件可以为公司、企业及院校提供日常的信息处理服务。可以解决信息交流中的信息量大繁多,及时性,广域性等相应的问题,为企业内部的凝聚,与外界的交流以及以后的发展带来了不可磨灭的功劳;2.网络通信软件也给用户的日常生活带了方便。用户可以通过这种通信软件找到自己的知己,并且可以和他们交流自己的知识,兴趣爱好等,也可以和自己的亲戚、朋友、同学可以在聊天室里畅所欲言;第2章系统概况1.用户登录:用户只有输入正确的用户账号、密码才有权利进入到聊天室,输入错误则会出现相应的提示; 2.聊天:用户指定相应的在线用户,输入信息,点击发送按钮,即可将信息发送给对方; 3.窗口抖动:聊天时点击抖动按钮,即可使聊天对方的窗口出现一定时间的抖动效果; 4.视频聊天:聊天双方在有视频的基础上,可以通过视频来进行“面对面”的聊天;2.2.1Java技术Java是Sun公司于1995年推出的程序设计语言。Java分为三个体系J2SE(Java平台标准版)、J2EE(Java平台企业版)和J2ME(Java平台微型版)。Java语言之所以发展这么迅速,主要在于它跨平台、开源,在Java里面很多项目都是开源的,就像Linux一样,也可以说是开源推动了它的进一步发展。 Java在现在依然是很火的一门编程语言,主要在于它有如下特点:Java语言是简单的。它相对于C或C++来说比较简单,它丢掉了C或C++里面的指针。它是面向对象的。在Java中可以认为万事万物皆对象。Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(javanet),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。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)进行数据库管理。并且其速度、可靠性和适应性都非常不错,而且还有可视化的插件,便于建表和进行其它的操作。多人聊天室中利用这种数据库实现的数据保存;硬件环境:个人计算机(内存1G+)软件环境:Eclipse3.3、JDK1.6、Mysql5.0、WindowsXP第3章系统分析本软件在计算机语言上采用的是当前流行的Java语言,这种语言具有很好的跨平台性,可以对不同的操作系统进行兼容,只需要用户的电脑上将有SUN公司开发的JDK1.4以上的版本就可以运行该程序;编辑器利用是Eclipse,这种编辑器具有很好的提示功能,支持插件,使用相当方便;数据库利用的是Mysql,这种数据库易于安装,所占的空间少,启动快,适合在局域网;该软件只需要一台将有JDK1.4以上版本的电脑即可,经济上实惠;由于电脑技术的发展,人们素质的提高,对于电脑的基本操作和维护都有了一定的基础,因此在维护上还是不成问题;在客户端我们根据软件的需要可以从它所应具有的界面个数来对它的功能进行分析;第一个登录界面在这个界面上,有两个输入框一个是账号,一个是密码;当输入完信息之后,点击登录按钮,客户端就会开始与服务器与行连接;在这个过程中要完成两件事情。一件是,客户端取得与服务器的连接,如果服务器没有开启或者网络不通,自然要给客户端一个友好的提示信息;另一件是,取得连接之后客户端将账号及密码信息发送给服务器,以确保该用户是否存在,如果不存在则提示账号或者密码错误,存在则进入下一个界面,进度条则会显示整个处理的进度情况;第二个用户列表界面这个界面是用户成功登录之后,展现该用户自己信息及所有好友信息的界面,这是每一个用户都必须有的界面,只有退出整个程序时这个界面才会消息;在这个界面上提供给用户进行操作的则是,用户可以根据自己的喜爱选择好友列表中相应的好友,双击头像图标进行聊天;第三个聊天窗口这是整个多人聊天室的主要界面;这在这界面上负责将自己的消息通过发达信息框发送给对方,并将对方的信息显示在信息显示框内;另外这个窗口还有相应的功能按钮提供给用户一些方便的操作。例如抖动按钮,发送按钮,视频聊天选项等;点击视频聊天选项会出现相应的视频聊天窗口,点击发送按钮会将消息发送出去,点击抖动按钮会使聊天对方的聊天窗口出现一段时间的抖动;3.2.2服务器功能分析服务器的主要功能则是将客户端发送过来的信息,进行验证和转发,服务器处理的工作较多,要求性能较好;在服务器端主要有一个界面,这个界面负责启动服务器,并且在服务器启动之后,会将所有存在的用户信息包括账号、密码、头像等信息显示在表格上,以方便后台的人员对用户进行相应的操作;另外所有用户发送给客户端的信息都会在信息显示框内进行显示,以便查看整个通信过程;。系统流程图展示了该系统客户端与服务器之间的逻辑关系,其中主要介绍的是服务器如何处理消息的一个过程,并将在下面的的系统设计阶段给出了相应的消息设计(XMPP)。由上图可以看出,一个客户端只要能过了账号、密码的验证就可以与其它相应的客户端取得联系,进行彼此之间的交流。而服务器为了单独处理第个客户端则利用了多线程技术,使得每个客户端的信息不至于混乱;第4章系统设计user表:id整型唯一IDname字符型用户名account字符型账号password字符型密码picture字符型头像friends表:通过friends表可以找到某个用户的所有朋友信息id整型唯一IDid_user字符型外键type字符型朋友类型friend_account字符型朋友账号4.2自定义XMPP协议1>客户端与服务器连接
a.没有连接上则返回超时,
b.连接上
密码错误则进行提示
正确则返回个人信息、用户列表并进入用户窗口
1-1.登录请求
<msg>
<type>login</type>
<account>账号</account>
<pwd>密码</pwd>
</msg>
1-2.登录应答
<msg>
<type>login_response</type>
<state>1表示成功,0表示失败</state>
</msg>
1-3.发送个人信息
<msg><type>user</type><name>用户名</name><account>用户账号</account><picture>用户头像</picture></msg>
1-4.发送好友队列信息默认2个组
<msg>
<type>好友类型</type>
<name>好友名</name>
<account>好友账号</account>
<picture>好友头像</picture>
</msg>
2.聊天
彼此在线,好友发送消息过来时,弹出对应的聊天框
2-1.<msg>
<type>chat</type>
<myaccount>本人账号</myaccount>
<friendaccount>朋友账号</friendaccount>
<content>内容</content>
</msg>
对方不在线时,给发送者提示
2-2.<msg>
<type>line</type>
<state>-1</state>
<friendaccount>不在线好友账号</friendaccount>
</msg>
3.抖动
点击抖动按钮则可以让对方的聊天框出现一段时间的抖动,条件是该好友要在线
3-1.<msg>
<type>shake</type>
<myaccount>发送方账号</myaccount>
<friendaccount>接收方账号</friendaccount>
</msg>
4.视频
4-1视频请求(点击开始视频按钮)
<msg>
<type>vidio</type>
<myaccount>发送方账号</myaccount>
<friendaccount>接收方账号</friendaccount>
<session>发送者的ip,port<session>
</msg>
4-2视频应答(点击接受按钮)
<msg>
<type>r_vidio</type>
<myaccount>发送方账号</myaccount>
<friendaccount>接收方账号</friendaccount>
<session>发送者的ip,port<session>第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("宋体",Font.TRUETYPE_FONT,12)); JLabelpwd_label=newJLabel("密码:"); pwd_label.setFont(newjava.awt.Font("宋体",Font.TRUETYPE_FONT,12));pwd=newJPasswordField(15); JLabelmod_label=newJLabel("修改密码"); mod_label.setFont(newjava.awt.Font("宋体",Font.TRUETYPE_FONT,12));//进度条 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("宋体",Font.TRUETYPE_FONT,12)); 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("宋体",Font.TRUETYPE_FONT,12));//将组件加到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();//叶节点1if((node.toString()).equals(data[0][1])){if(frame==null){frame=newChatFrame(1,data,per,session); } }//叶节点2if((node.toString()).equals(data[1][1])){if(frame2==null){frame2=newChatFrame(2,data,per,session); } } } } });jTree0.setModel(treeModel); }returnjTree0; }5.1.3聊天窗口及视频界面FMJ视频聊天室的实现视频聊天整体结构分析整体流程图示: 服务器和客户机通过基于UDP的RTP通信协议传输媒体流数据,在建立RTP会话之前,先建立一个Socket连接,以发送接收其它请求消息,如要发送多媒体数据的请求和应答消息。发送视频请求消息和完成应答之后,服务器利用客户机发上来的消息建立RTP会话,因此在视频请求的消息中应包含客户机的地址、端口等消息,以供服务器建立RTP会话。客户机也要和服务器建立对应的RTP会话,这样,视频数据流就可以通过RTP会话传输:关键代码:/***本地播放的方法*@param:dataSource要初始化的数据源*/publicvoidplaySource(){try{//创建一个播放器对象player=javax.media.Manager.createPlayer(dataSource);//创建一个播放器的控制器监听器对象 MyRTPListenerl=newMyRTPListener(player,ServerStart.jf, ServerStart.panel);//给播放器对象注册控制器监听器player.addControllerListener(l);//开始播放player.start(); }catch(Exceptione){ e.printStackTrace(); } }/****/publicsynchronizedvoidcontrollerUpdate(ControllerEvente){if(einstanceofjavax.media.RealizeCompleteEvent){ Componentcomp;//得到播放器的可视容器,即播放器显示视频的容器if((comp=player.getVisualComponent())!=null){//将可视容器加到窗体上panel.add("Center",comp); }//得到播放器的控制面板容器if((comp=player.getControlPanelComponent())!=null){//添加到窗体上panel.add("South",comp); }//刷新窗体jf.validate(); } }/***初始化RTP会话**@return*/protectedbooleaninitialize(){try{mgrs=newRTPManager[sessions.length]; SessionLabelsession;//打开会话for(inti=0;i<sessions.length;i++){//解析会话地址try{ session=newSessionLabel(sessions[i]); }catch(IllegalArgumentExceptione){ System.err .println("Failedtoparsethesessionaddressgiven:" +sessions[i]);returnfalse; } System.err.println("-OpenRTPsessionfor:addr:" +session.addr+"port:"+session.port+"ttl:" +session.ttl);mgrs[i]=(RTPManager)RTPManager.newInstance();mgrs[i].addSessionListener(this);mgrs[i].addReceiveStreamListener(this);//初始化RTPManager用RTPSocketAdaptermgrs[i].initialize(newRTPSocketAdapter(InetAddress .getByName(session.addr),session.port,session.ttl)); BufferControlbc=(BufferControl)mgrs[i] .getControl("javax.media.control.BufferControl");if(bc!=null) bc.setBufferLength(350); } }catch(Exceptione){ System.err.println("CannotcreatetheRTPSession:" +e.getMessage());returnfalse; }//等待数据到达.longthen=System.currentTimeMillis();longwaitingPeriod=30000;//waitforamaximumof30secs.try{synchronized(dataSync){while(!dataReceived &&System.currentTimeMillis()-then<waitingPeriod){if(!dataReceived) System.err .println("-WaitingforRTPdatatoarrive");dataSync.wait(1000); } } }catch(Exceptione){ }if(!dataReceived){ Sys
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年二级建造师之二建公路工程实务押题练习试题A卷含答案
- 劳务派遣合同样本(2025版)
- 2025年铁路轨枕垫项目发展计划
- 广西2025年上半年房地产估价师《相关知识》:检查会计错弊模拟试题
- 实验室场地租赁合同(2025版)
- 浅谈建设工程合同管理2025年
- 全新杀虫服务合同(2025版)
- 食堂承包的协议书范本(2025版)
- 商铺租房协议书(2025版)
- 门面房买卖协议书范本大全2025年
- 物理●福建卷丨2024年福建省普通高中学业水平选择性考试物理试卷及答案
- 急性胸痛急救常识
- 陶瓷合作协议书合同
- 宣传片拍摄合作协议合同
- 重大电力重大隐患判定标准课件
- 2024年河南省焦作市武陟县小升初数学试卷(带答案)人教版
- 军队保密协议
- 《货币的发展历程》课件
- GSP认证质量管理体系文件
- 《电子商务基础》课件-1.电子商务认知与发展
- 海淀耐磨地坪施工方案
评论
0/150
提交评论