1、 4.视频聊天:聊天双方在有视频的基础上,可以通过视频来进行“面对面”的聊天;2.2系统所用技术2.2.1 Java技术 Java是Sun公司于1995年推出的程序设计语言。Java分为三个体系J2SE(Java平台标准版)、J2EE(Java平台企业版)和J2ME(Java平台微型版)。Java语言之所以发展这么迅速,主要在于它跨平台、开源,在Java里面很多项目都是开源的,就像Linux一样,也可以说是开源推动了它的进一步发展。 Java在现在依然是很火的一门编程语言,主要在于它有如下特点:1.Java语言是简单的。它相对于C或C+来说比较简单,它丢掉了C或C+里面的指针。2.它是面向对象
2、的。在Java中可以认为万事万物皆对象。3.Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。4.Java语言也是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行
3、时刻的类型检查。2.2.2 TCP/IP协议TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以与数据如何在它们之间传输的标准。TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。低层是网际协议,它处理每个包的地址部分,使这些包正确的到
4、达目的地。在多人聊天室中则是在这种协议基础上实现的彼此之间的信息交流;2.2.3 JMF使用RTP协议实时传输协议RTP(Real-Time Transport Protocol)是针对Internet上多媒体数据流的一个传输协议,由IETF(Internet工程任务小组)作为RFC1889发布。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP的典型应用建立在UDP上,但也可以建立在TCP或ATP等其它协议之上工作。RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。在多人聊
5、天室中则是在这种通信协议的基础上实现的视频聊天;2.2.4 Mysql数据库MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言-结构化查询语言(SQL)进行数据库管理。并且其速度、可靠性和适应性都非常不错,而且还有可视化的插件,便于建表和进行其它的操作。多人聊天室中利用这种数据库实现的数据保存;2.3系统运行环境硬件环境:个人计算机(内存1G+)软件环境:Eclipse 3.3 、JDK 1.6、Mysql 5.0 、Windows XP第3章 系统分析3.1关于系统分析3.1.1可行性分析本软件在计算机语言上采用的是当前流行的Jav
6、a语言,这种语言具有很好的跨平台性,可以对不同的操作系统进行兼容,只需要用户的电脑上将有SUN公司开发的JDK1.4以上的版本就可以运行该程序;编辑器利用是Eclipse,这种编辑器具有很好的提示功能,支持插件,使用相当方便;数据库利用的是Mysql,这种数据库易于安装,所占的空间少,启动快,适合在局域网;该软件只需要一台将有JDK1.4以上版本的电脑即可,经济上实惠;由于电脑技术的发展,人们素质的提高,对于电脑的基本操作和维护都有了一定的基础,因此在维护上还是不成问题;3.2系统功能分析3.2.1客户端功能分析在客户端我们根据软件的需要可以从它所应具有的界面个数来对它的功能进行分析;第一个
7、登录界面在这个界面上,有两个输入框一个是账号,一个是密码;当输入完信息之后,点击登录按钮,客户端就会开始与服务器与行连接;在这个过程中要完成两件事情。一件是,客户端取得与服务器的连接,如果服务器没有开启或者网络不通,自然要给客户端一个友好的提示信息;另一件是,取得连接之后客户端将账号与密码信息发送给服务器,以确保该用户是否存在,如果不存在则提示账号或者密码错误,存在则进入下一个界面,进度条则会显示整个处理的进度情况;第二个 用户列表界面这个界面是用户成功登录之后,展现该用户自己信息与所有好友信息的界面,这是每一个用户都必须有的界面,只有退出整个程序时这个界面才会消息;在这个界面上提供给用户进行
8、操作的则是,用户可以根据自己的喜爱选择好友列表中相应的好友,双击头像图标进行聊天;第三个 聊天窗口 这是整个多人聊天室的主要界面;这在这界面上负责将自己的消息通过发达信息框发送给对方,并将对方的信息显示在信息显示框内;另外这个窗口还有相应的功能按钮提供给用户一些方便的操作。例如抖动按钮,发送按钮,视频聊天选项等;点击视频聊天选项会出现相应的视频聊天窗口,点击发送按钮会将消息发送出去,点击抖动按钮会使聊天对方的聊天窗口出现一段时间的抖动;3.2.2 服务器功能分析服务器的主要功能则是将客户端发送过来的信息,进行验证和转发,服务器处理的工作较多,要求性能较好;在服务器端主要有一个界面,这个界面负责
9、启动服务器,并且在服务器启动之后,会将所有存在的用户信息包括账号、密码、头像等信息显示在表格上,以方便后台的人员对用户进行相应的操作;另外所有用户发送给客户端的信息都会在信息显示框内进行显示,以便查看整个通信过程;3.3系统流程图为了更清楚地说明系统框架,以便更好地说明设计该系统的解决方案,我们给出了系统流程图,如图3.1。系统流程图展示了该系统客户端与服务器之间的逻辑关系,其中主要介绍的是服务器如何处理消息的一个过程,并将在下面的的系统设计阶段给出了相应的消息设计(XMPP)。 图3.1由上图可以看出,一个客户端只要能过了账号、密码的验证就可以与其它相应的客户端取得联系,进行彼此之间的交流。
10、而服务器为了单独处理第个客户端则利用了多线程技术,使得每个客户端的信息不至于混乱;第4章 系统设计4.1数据库表设计 user 表:id整型唯一IDname字符型用户名account账号password密码picture头像 friends 表:通过friends 表可以找到某个用户的所有朋友信息id_user外键type朋友类型friend_account朋友账号4.2 自定义XMPP协议1-客户端与服务器连接 a.没有连接上则返回超时, b.连接上 密码错误则进行提示 正确则返回个人信息、用户列表并进入用户窗口 1-1 . 登录请求 typeloginaccount账号pwd密码/msg1
11、-2 . 登录应答 login_response1表示成功,0表示失败1-3 . 发送个人信息 user用户名用户账号用户头像1-4 . 发送好友队列信息-默认2个组 好友类型好友名好友账号好友头像2 . 聊天 彼此在线,好友发送消息过来时,弹出对应的聊天框 2-1. chat本人账号friendaccount朋友账号content内容 对方不在线时,给发送者提示 2-2. line-1不在线好友账号3 . 抖动 点击抖动按钮则可以让对方的聊天框出现一段时间的抖动,条件是该好友要在线 3-1. shake发送方账号接收方账号4. 视频 4-1 视频请求(点击开始视频按钮) vidio发送者的i
12、p,port 4-2 视频应答(点击接受按钮) r_vidio第5章 系统实现5.1 客户端实现5.1.1 登录界面关键代码:private void creatFrame() this.setTitle(QQ2011); this.setSize(340, 250); / 三个panel-加中一个布局管理器给图片定位 JPanel pan1 = new JPanel(new java.awt.FlowLayout(0, 0, 0); JPanel pan2 = new JPanel(); JPanel pan3 = new JPanel(new java.awt.FlowLayout(0,
13、10, 3); / pan2上的三个jpanel JPanel pan4 = new JPanel(); JPanel pan5 = new JPanel(); JPanel pan6 = new JPanel(); / pan1上的标签-要标签上加一张图片 JLabel lab1 = new JLabel(); javax.swing.ImageIcon img1 = new javax.swing.ImageIcon( images/login1.jpg lab1.setIcon(img1); / 在三个jpanel上设图片和背景 pan1.add(lab1); pan2.setBackg
14、round(new java.awt.Color(228, 244, 255); pan3.setBackground(new java.awt.Color(194, 255, 250); / 设组件 JLabel name_label = new JLabel(账号: name_label.setFont(new java.awt.Font(宋体, Font.TRUETYPE_FONT, 12); text = new JTextField(15); JLabel reg_label = new JLabel( 注册账号 reg_label.setFont(new java.awt.Font
15、( JLabel pwd_label = new JLabel(密码: pwd_label.setFont(new java.awt.Font( pwd = new JPasswordField(15); JLabel mod_label = new JLabel( 修改密码 mod_label.setFont(new java.awt.Font( / 进度条 JProgressBar bar = new JProgressBar(); JProBar prob=new JProBar(bar); /启动进度条 prob.start(); bar.setBackground(Color.red
16、); JLabel bar_label = new JLabel( JButton set_bt = new JButton(设置 set_bt.setSize(60, 5); set_bt.setFont(new java.awt.Font( JLabel empty_label = new JLabel( / 给登录按钮、密码输入框注册侦听器 JButton log_bt = new JButton(登录 LoginButtonListener listener = new LoginButtonListener(this); log_bt.addActionListener(listen
17、er); pwd.addActionListener(listener); log_bt.setSize(60, 5); log_bt.setFont(new java.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, BorderLa
18、yout.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, Borde
19、rLayout.CENTER); this.add(pan3, BorderLayout.SOUTH); this.setDefaultCloseOperation(3);/ 关闭窗口时退出运行 this.setLocationRelativeTo(null);/ 位于窗口的中间 this.setVisible(true);/ 可视 this.setResizable(false);/ 设定窗口不可改变大小 5.1.2 用户列表界面private JTree getJTree0() if (jTree0 = null) jTree0 = new JTree(); DefaultTreeMode
20、l treeModel = null; / 根结点 DefaultMutableTreeNode root = new DefaultMutableTreeNode(好友列表 / 根据好友列表建树 / 第一层,好友类型 for (int i = 0; i 2; i+) DefaultMutableTreeNode node1 = new DefaultMutableTreeNode( datai0); / 第二层,好友名字 for (int j = 0; j 1; j+) DefaultMutableTreeNode node2 = new DefaultMutableTreeNode( da
21、tai1); node1.add(node2); root.add(node1); / 表模型 treeModel = new DefaultTreeModel(root); / 给叶节点加上图片 ImageIcon image = new ImageIcon(images/163.gif DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); renderer.setLeafIcon(image); jTree0.setCellRenderer(renderer); / 给节点加上双击事件 jTree0.addMou
22、seListener(new MouseAdapter() public void mouseClicked(MouseEvent e) if (e.getClickCount() = 2) / 点击路径 TreePath path = jTree0.getPathForLocation(e.getX(), e .getY(); / 根据路径得到节点 TreeNode node = (TreeNode) path.getLastPathComponent(); / 叶节点1 if (node.toString().equals(data01) if (frame = null) frame = new ChatFrame(1,data,per,session); / 叶节点2 if (node.toString().equals(data11) if (frame2 = null)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1