精品毕业论文基于java的qq聊天工具的设计与实现_第1页
精品毕业论文基于java的qq聊天工具的设计与实现_第2页
精品毕业论文基于java的qq聊天工具的设计与实现_第3页
精品毕业论文基于java的qq聊天工具的设计与实现_第4页
精品毕业论文基于java的qq聊天工具的设计与实现_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要 Java 技术的合理应用能实现跨平台的网络通讯。 本人按照软件工程的原则,运用 TCP/UDP 通信协议,以及套接字、数据库、 线程等技术,依靠强大的跨平台开发软件 JBuilder9.0,以当今流行的 QICQ 为模 板,仿照 QICQ 设计出简单而实用的、具有基本聊天功能的、基于 JAVA 的聊天 工具。 本论文主要讲述了此设计所采用的开发工具、总体规划与设计方案,以及详 细设计和主要功能模块的工作原理及其图解。在文中提供了部分功能模块实现的 源代码。最后,本文还粗略地探讨了软件的测试用例设计和完成此次设计的心得 体会。 关键词:JAVA; 数据库; 线程; JBuilder9.0; QICQ ABSTRACT The reasonable application of Java technology can achieve network communication which can be run at any environment. According to the principle of the Software Engineering,using TCP/UDP protocol, socket,database and thread etc,depending on the powerful tool JBuilder9.0,refering to the template of QICQ,imitating QICQ,I design a simple、practicable and having chat functional talk tool which is based on JAVA. The paper not only mainly described development tool、collectivity layout and designing scheme about this designing,but also described detailing 、working law about main functions module and its diagrammatizing. In the paper we provide some source code with achieving part of function modules. At last we can learn experience in this designing and roughly discuss software test example designing. KEYWORDS S:JAVA;database;thread;JBuilder9.0;QICQ 目 录 摘要 I AbstractII 1 序言 .1 2 开发工具1 2.1 JBUILDER 9.0 .1 2.2 SQL SERVER 2000 .2 2.1.1 SQL 简介2 2.1.3 SQL 数据库体系结构2 2.1.4 SQL 的组成.3 3 总体规划与设计方案 .3 3.1 需求分析 3 3.1.1 基本功能需求 3 3.1.2 环境需求 3 3.1.3 性能需求 3 3.1.4 界面需求 4 3.1.5 用户需求 4 3.2 方案的选择以及模块设计 4 3.2.1 通讯协议的选择 4 3.2.2 数据库系统的选择 4 3.2.3 线程技术的应用 5 3.2.4 套接字 SOCKET 的应用7 3.3 整体方案的制定 8 4 详细设计 .9 4.1 数据表设计 9 4.2 系统的类设计 .10 4.2.1 类规范设计 .10 4.2.2 类的 UML 图 13 4.3 应用功能的设计 .13 4.4 主要界面设计 .16 5 软件功能测试 17 6 总结 18 6.1 设计体会 .18 6.2 实现中所遇到的问题 .18 6.3 今后研究的方向 .18 参考文献 19 致 谢 20 附录 21 1 1 序言 21 世纪是信息社会的时代,科学和技术和社会的发展正在迎接这个时代的到来, 当前信息网络得到飞速的发展,尤其是计算机和通信技术的发展和结合,改变了人 民的生活、学习和工作方式,减轻工作的负担,提高生活水平,推动社会的进步。 当前电子商务、ERP、WAP 等技术正深深的影响着我们。 尤其值得一提的是,网络聊天和网络游戏逐步成为大部分年轻人休闲和娱乐的 方式,其深入人心的程度不亚于电视媒体的普及程度,甚至有赶超的趋势。做为一 个学习计算机专业的人来说,对网络的痴迷以及对网络的未知的领域的探索成为了 我一直向往的事情,不断学习和钻研。 当前,网民中无人不知 QICQ 这个即时的聊天工具,其简单,易操作性风靡全 国。QICQ 其实是获得成功的 ICQ 的本土化产品,ICQ 是英文“I seek you “的简称, 中文意思是我找你的意思。ICQ 的最大功能是信息交流,只要记得对方号码,上网 时间可以呼他,无论他在哪里,只要他上网打开 ICQ,人门可以随时交流。ICQ 源 于以色列物拉维夫的 Mirabils 公司。该公司成立于 1996 年 7 月,也就是在这个时候, 互联网上最出名,下载使用人数最多的免费软件 ICQ 诞生了。可能是其不断增加的 用户和广阔的前景以及广泛的应用 前景和巨大的市场潜力,Mirabils 的 ICQ 最终被 美国在线 AOL 公司收购。由于 ICQ 的成功,推动了 ICQ 的本土化,就中文 ICQ 而 言,著名的深圳腾迅公司推出的 QICQ(现在由于版权的问题,已经改名为 Tencent QQ) ,还有新浪公司的 UC 等。这些软件都很好,而且简单易用,成为中国网名最 喜欢的通讯软件。 由于 QICQ 极其出色的通信性能以及普及程度,让我萌发了设计自己的 ICQ 的 念头,模仿 ICQ 的使用过程,基本实现其聊天功能。 2 开发工具 2.1 JBuilder 9.0 Jbuilder9.0 是目前开发 JAVA 程序的最佳选择,它不但有图形化的界面,而且 有完整的编译工具,可以明显的缩短程序的开发时间。 Borland JBuilder 是业界领先的 Java 可视化开发环境,可用于构建基于 Java 2 平台的应用程序、Applets、JSP/Serverlets、JavaBeansTM、Enterprise JavaBeans,以 及分布式 J2EE 应用。JBuilder 6 最新特性包括:EJBTM 2.0 可视化设计器快速开发 J2EETM 应用程序;将应用分发至以下应用服务器:Borland Application Server、BEA WebLogic、IBM WebSphere 和 iPlanetTM Application Server;简化数据 库应用开发与分发的各种向导、工具和组件;采用 JSPTM 和 Serlets 进行 Web 应 用程序的开发和分发;UML 代码可视化功能;重构和单元测试;集成业界领先的版 本控制系统;XML 工具可跨设备公布和集成商务数据 2.2 SQL SERVER 2000 2.1.1 SQL 简介 SQL 全称是“结构化查询语言(Structured Query Language)” 。最早是 IBM 的圣 约瑟研究实验室为其关系数据库管理系统 SYSTEM R 开发的一种查询语言,它的前 身是 SQUARE 语言。SQL 语言结构简洁,功能强大,简单易学,所以自从 IBM 公 司 1981 年推出以来,SQL 语言得到了广泛的应用。目前,SQL 语言已被确定为关 系数据库系统的国际标准,被绝大多数商品化关系数据库系统采用,如 Oracle 、Sybase、DB2、Informix、SQL Server 这些数据库管理系统都支持 SQL 语言作为查 询语言。 结构化查询语言 SQL 是一种介于关系代数与关系演算之间的语言,其功能包括 查询、操纵、定义和控制四个方面,是一个通用的功能极强的关系数据库标准语言。 在 SQL 语言中不需要告诉 SQL 如何访问数据库,只要告诉 SQL 需要数据库做什么。 2.1.3 SQL 数据库体系结构 SQL 数据库的体系结构基本上也是三级模式。SQL 术语与传统的关系模型术语 不同。在 SQL 中,外模式对应于视图,模式对应于基本表,元组称为“行” ,属性 称为“列” 。内模式对应于存储文件。 SQL 数据库的体系结构特征: 一个 SQL 模式(Schema)是表和约束的集合。 一个表(Table)是行(Row)的集合,每行是列(Column)的序列,每列对应一个数据 项。 个表可以是一个基本表,也可以是一个视图,基本表是实际存储在数据库中 的表。视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也 就是说数据库中只存放视图的定义而不存放视图的数据,视图是一个虚表。 一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基 本表,一个表可以带若干索引,索引也存放在存储文件中。每个存储文件与外部存 储器上一个物理文件对应。存储文件的逻辑结构组成了关系数据库的内模式。 用户可以用 SQL 语句对视图和基本表进行查询等操作。在用户看来,视图和基 本表是一样的,都是关系(即表格)。 SQL 用户可以是应用程序,也可以是终端用户。SQL 语句可嵌入在宿主语言的 程序中使用;SQL 语言也能作为独立的用户接口,供交互环境下的终端用户使用。 2.1.4 SQL 的组成 SQL 主要分成四个部分: 数据定义:这一部分也称为“DDL” ,用于定义 SQL 模式、基本表、视图和索 引。 数据操纵:这一部分也称为“DML”,数据操纵分成数据查询和数据更新两类, 其中数据更新又分成插入、删除和修改三种操作。 数据控制:这一部分也称为“DCL” 。数据控制包括对基本表和视图的授权,完 整性规则的描述,事务控制语句等。 3 总体规划与设计方案 3.1 需求分析 3.1.1 基本功能需求 新用户注册:一般用户都想知道其他用户的一些基本资料,比如姓名、年龄、地 址、IP 地址等一些信息。 查找以及添加好友:用户为了实现和其他人聊天,必须查找哪些人在线或者查找 有哪些人使用该聊天工具.通过查找到的用户号码来实现添加其为好友。 文字聊天:本聊天工具其实现的目的就是为了实现和用户间的沟通和交流,所以 说文字聊天是必须具备的一项基本功能。 用户个性化资料:用户申请的号码应该可以实现用户根据自己的喜好选择自己 喜欢的图象、自我介绍。 查看聊天记录:用户在聊天的时候,难免会遇到把聊天窗口关掉,这样用户间的聊 天信息也就看不到了,这样有可能导致用户不记得和其他用户聊的内容,导致这种结果 对用户的聊天带来很大的不便,所以应该实现聊天信息的记录保存和查找。 用户管理:用户有时候要修改和查看自己的用户资料,这样本系统应该实现用户 资料的查询和修改这基本功能。 3.1.2 环境需求 支持 WIN95/98/NT/2000/XP 操作系统 C200,32M 内存以上可以正常运行 其他无特殊要求 3.1.3 性能需求 尽量减少服务器的开销及数据传送负担,提高数据利用效率和数据传送效率, 避免无效数据的传输。 3.1.4 界面需求 界面友好,聊天对话框线程支持,实现无限制数量用户聊天。 服务器端无特殊要求 3.1.5 用户需求 现在社会是信息化的社会,什么都追求着快、新、好。在这种快节奏的生活方 式中,人们之间的通讯联系就显得非常的重要了。商业之间的合作,人们之间的友 谊交往,甚至热门谈到的网上恋爱等等都需要通讯联系。而过去的鸿雁传书已经是 满足不了现代人的欲望了。既然这网络这么的流行,过去的联系方式又这么的落后, 因此人们的目光就转向了网络通讯。聊天工具就是一种网上很普遍但是又很重要的 通讯方式。 3.2 方案的选择以及模块设计 3.2.1 通讯协议的选择 TCP 与 UDP 有各自的优点。TCP 是面向连接的协议,能满足大范围的应用程序 的要求,能调节网际的动态环境,建立和管理本地通信进程之间的对话,维护 TCP 在流出和流入传输层 TCP 的模块的每个用户的状态和信息,拥有窗口流量控制机制 和重传机制,实现非常可靠的数据传输,它的安全性和可靠性比 UDP 要高出很多。 UDP 是面向非连接的传输协议,UDP 的应用程序在高可靠性、低延迟的网络中运行 很好,在通讯子网 QoS 相对低下的情况下,可能无法正常运行,因为在于数据包的 频繁丢失。虽然 UDP 如此不可靠,但是由于它传输的高效率,仍然被广泛采用。在 某些场合的一来一往只有两次数据报的交换中,UDP 比 TCP 更加有效,因为 TCP 的建立连接和撤消连接的开销往往要大得多。 QICQ 在客户端与服务器端的协议采用了 UDP,虽然在效率上占了优势,因为 依照目前网络通讯的发展,通信子网在其性能上的提高,使得 UDP 可以发挥其强大 的优势,但是安全性却实在令人担忧。 综合考虑的结果,在本聊天工具的客户端和服务器端的通讯采用 TCP 协议。而 客户与客户端的通讯采用 UDP 协议。 3.2.2 数据库系统的选择 在使用数据库时,我已经学过 ACCESS 和 SQL Server 两种数据库,综合考虑, 我选择 SQL Server。因为: Access 是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访 问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于 4 个。 access 数据库有一定的极限,如果数据达到 100M 左右,很容易造成服务器 iis 假死, 或者消耗掉服务器的内存导致服务器崩溃。 SQL Server 是基于服务器端的中型的数据库,可以适合大容量数据的应用,在 功能上管理上也要比 Access 要强得多。在处理海量数据的效率,后台开发的灵活性, 可扩展性等方面强大。因为现在数据库都使用标准的 SQL 语言对数据库进行管理, 所以如果是标准 SQL 语言,两者基本上都可以通用的。SQL Server 还有更多的扩展, 可以用存储过程,数据库大小无极限限制。 SQL Server 数据库的特征及其与 Access 数据库的区别: 表 3.1 SQL Server 数据库的特征与 Access 数据库的区别 内容Access 特征MS SQL 特征 版本桌面版 网络版 可支持跨界的公司异地使用数据 库的要求 节点 一人工作,要锁定,其他 人无法使用 节点多,支持多重路由器 管理权限否管理权限划分细致,对内安全性高 防黑客功能否数据库划分细致,对外防黑客能力高 并发处理能力100 人或稍多 同时支持万人在线提交,在其他硬件例如 网速等条件匹配的情况下可完全实现 导出 XML 格式可以,需要单作程序 可导出成为 XML 格式,与 Oracle 数据库 通用,减少开发成本 数据处理能力一般快 是否被优化过否是 3.2.3 线程技术的应用 在单线程系统中,如果系统进行如网络数据发送等在后台进行工作的应用程序时, 程序界面就会处于死锁状态,无法接受用户的输入。但在 WIN95/NT 中实行的是抢 占式多任务,每一个进程可以同时执行多个任务,对于本系统,既要进行网络耗时 工作,又要保持对用户的响应,使用多线程是最佳选择。 以下是关于线程的一些概念。 一般来说,把正在计算机中执行的程序叫做“进程“(Process) ,而不将其称为程序 (Program)。所谓“线程“(Thread),是“进程“中某个单一顺序的控制流。 现代的操作系统,如 Mac,Windows NT,Windows 95 等,大多采用多线程的概念,把 线程视为基本执行单位。线程也是 Java 中的相当重要的组成部分之一。 甚至最简单的 Applet 也是由多个线程来完成的。在 Java 中,任何一个 Applet 的 paint()和 update()方法都是由 AWT(Abstract Window Toolkit)绘图与事件处理线程调用 的,而 Applet 主要的里程碑方法init(),start(),stop()和 destory() 是由执行该 Applet 的应用调用的。 单线程的概念没有什么新颖的地方,我感兴趣的是在一个程序中同时使用多个线 程来完成不同的任务。某些地方用轻量进程(Lightweight Process)来代替线程,线程与 真正进程的相似性在于它们都是单一顺序控制流。然而线程被认为轻量是由于它运 行于整个程序的上下文内,能使用整个程序共有的资源和程序环境。 作为单一顺序控制流,在运行的程序内线程必须拥有一些资源作为必要的开销。 例如,必须有执行堆栈和程序计数器。在线程内执行的代码只在它的上下文中起作用, 因此某些地方用“执行上下文“来代替“线程“。 (1)线程体 所有的操作都发生在线程体中,在 Java 中线程体是从 Thread 类继承的 run()方法, 或实现 Runnable 接口的类中的 run()方法。当线程产生并初始化后,实时系统调用它 的 run()方法。run()方法内的代码实现所产生线程的行为,它是线程的主要部分。 (2)线程状态 新线程态(New Thread) 产生一个 Thread 对象就生成一个新线程。当线程处于“新线程“状态时,仅仅是一 个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他操作都 会引发异常。 可运行态(Runnable) start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的 run()方法。 在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占 用处理机。特别是对于只有一个处理机的 PC 而言,任何时刻只能有一个处于可运行 态的线程占用处理 机。Java 通过调度来实现多线程对处理机的共享。 非运行态(Not Runnable) 当以下事件发生时,线程进入非运行态。 suspend()方法被调用; sleep()方法被调用; 线程使用 wait()来等待条件变量; 线程处于 I/O 等待。 死亡态(Dead) 当 run()方法返回,或别的线程调用 stop()方法,线程进入死亡态 。通常 Applet 使 用它的 stop()方法来终止它产生的所有线程。 (3)线程优先级 虽然我们说线程是并发运行的。然而事实常常并非如此。正如前面谈到的,当系 统中只有一个 CPU 时,以某种顺序在单 CPU 情况下执行多线程被称为调度 (scheduling)。Java 采用的是一种简单、固定的调度法,即固定优先级调度。这种算法 是根据处于可运行态线程的相对优先级来实行调度。当线程产生时,它继承原线程的 优先级。在需要时可对优先级进行修改。在任何时刻,如果有多条线程等待运行,系统 选择优先级最高的可运行线程运行。只有当它停止、自动放弃、或由于某种原因成 为非运行态低优先级的线程才能运行。如果两个线程具有相同的优先级,它们将被交 替地运行。 Java 实时系统的线程调度算法还是强制性的,在任何时刻,如果一个比其他线程优 先级都高的线程的状态变为可运行态,实时系统将选择该线程来运行。 (4)幽灵线程 任何一个 Java 线程都能成为幽灵线程。它是作为运行于同一个进程内的对象和 线程的服务提供者。例如,HotJava 浏览器有一个称为“ 后台图片阅读器“的幽灵线程, 它为需要图片的对象和线程从文件系统或网络读入图片。 幽灵线程是应用中典型的独立线程。它为同一应用中的其他对象和线程提供服 务。幽灵线程的 run()方法一般都是无限循环,等待服务请求。 (5)线程组 每个 Java 线程都是某个线程组的成员。线程组提供一种机制,使得多个线程集于 一个对象内,能对它们实行整体操作。譬如,你能用一个方法调用来启动或挂起组内的 所有线程。Java 线程组由 ThreadGroup 类实现。 当线程产生时,可以指定线程组或由实时系统将其放入某个缺省的线程组内。线 程只能属于一个线程组,并且当线程产生后不能改变它所属的线程组。 3.2.4 套接字 SOCKET 的应用 套接字 SOCKET 的一些基本概念 所谓 socket 通常也称作“套接字“,用于描述 IP 地址和端口,是一个通信链的句 柄。应用程序通常通过“套接字“向网络发出请求或者应答网络请求。 以 J2SDK-1.5 为例,Socket 和 ServerSocket 类库位于 包中。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都 会产生一个 Socket 实例,操作这个实例,完成所需的会话。对于一个网络连接来说, 套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不 管是 Socket 还是 ServerSocket 它们的工作都是通过 SocketImpl 类及其子类完成的。 重要的 Socket API: .Socket 继承于 java.lang.Object,有八个构造器,其方法并不多,下面介 绍使用最频繁的三个方法,其它方法大家可以见 JDK-1.3 文档。 Accept 方法用于产生“阻塞“,直到接受到一个连接,并且返回一个客户端的 Socket 对象实例。“阻塞“是一个术语,它使程序运行暂时“停留“在这个地方,直到一 个会话产生,然后程序继续;通常“阻塞“是由循环产生的。 getInputStream 方法获得网络连接输入,同时返回一个 IutputStream 对象实例。 getOutputStream 方法连接的另一端将得到输入,同时返回一个 OutputStream 对象实 例。 注意:其中 getInputStream 和 getOutputStream 方法均会产生一个 IOException, 它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。 .利用 socket 开发一个 Server-Client 模型的程序的开发原理: 服务器,使用 ServerSocket 监听指定的端口,端口可以随意指定(由于 1024 以 下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大 于 1024 的端口) ,等待客户连接请求,客户连接后,会话产生;在完成会话后,关 闭连接。 客户端,使用 Socket 对网络上某一个服务器的某一个端口发出连接请求,一旦 连接成功,打开会话;会话完成后,关闭 Socket。客户端不需要指定打开的端口, 通常临时的、动态的分配一个 1024 以上的端口。 3.3 整体方案的制定 图 3.2 聊天工具的系统运行图 后台数据库 TCP 套接字监听端口TCP 套接字 服务器端 线程处理线程处理 UDP 套接 字 UDP 套接 字 客户端 1客户端 2 TCP 套接字TCP 套接字 4 详细设计 4.1 数据表设计 本聊天工具建立的数据库中各个表的设计结果如下面表格所示。每个表格表示 数据库中的一个表。 (1) 用户的基本信息表(表名 personalinfo) 字段名称数据类型说明 qnum数字用户号码 petname文本用户呢称 password文本用户密码 name文本用户姓名 sex文本用户性别 email文本用户 EMAIL status是否用户是否在线 picindex数字用户图象号 ip文本用户 IP 地址 其中 qnum 字段为自动增加。 (其他还可以添加诸如电话号码等字段作为更多选择) (2)用户的好友表(表名 friend) 字段名称数据类型说明 myqno数字用户的号码 friendqno数字好友的号码 (2) 用户的陌生人表(表名 stranger) 字段名称数据类型说明 myqno数字用户的号码 strangerqno数字陌生人的号码 (3) 用户的黑名单表(表名 blacklists) 字段名称数据类型说明 myqno数字用户的号码 blackqno数字黑名单的号码 就上述几张表,下面给出表的 E-R 关系图,如下图 4.1 所示: 图 4.1 表的 E-R 关系图 同理,用户同陌生人和黑名单的 E-R 关系图基本相似,故省略之。 4.2 系统的类设计 4.2.1 类规范设计 类名类名: : Server.javaServer.java 功能: 主要处理来自客户端的请求 主要方法: 1、public void run() 作用:处理客户端来的请求 2、public static void main(String args) 作用:无限监听客户端的请求,并且处理该请求 处理逻辑:新建一个SOCKET,无限的监听来自客户的请求,如果接收到来自用 户的请求,就创建一个线程来处理该请求。 类名类名: : Login.javaLogin.java 功能:主要实现用户的登陆还有提供用户注册界面的跳转 主要方法: 1、private void jbInit() QQ 用户 name status qnumpetname ip passwordpicindex 好友 QQ 好友 1n name status qnum petname ip password picindex 作用:初始化登陆界面 2、 void LButton_actionPerformed(ActionEvent e) 作用:处理用户登陆 处理逻辑:向服务器端发送用户登陆请求,并等待服务器响应,然后验证密码和 所填写的密码是否正确,如果正确就弹出主页面。 3、 void RButton_actionPerformed(ActionEvent e) 作用:处理用户注册 处理逻辑:如果用户点击注册就弹出注册框。 类名:类名:Register.javaRegister.java 功能:主要实现用户的注册 主要方法: 1、void jButton1_actionPerformed(ActionEvent e) 作用:添加新注册用户信息到服务器; 处理逻辑:如果判断用户名、密码域不为空,以及两次输入的密码相同,则 向服务器端发送新建用户请求,并等待服务器响应。 类名:类名:MainWain.javaMainWain.java 功能:主要实现用户登陆后进入的界面 主要方法: 1、 public void ConnectServer(int myqno) 作用:该函数连接服务器 2、 public MainFrame(int qno,String sername,int serport) 作用:该函数主要是实现主界面的构造还有加载用户好友,黑名单和陌生人信 息 处理逻辑:用Vevtor对象保存从服务器发来的用户好友,黑名单和陌生人信息, 然后显示在主界面,然后建立线程无限监听来自好友发来的消息。 类名:类名:MessageSend.javaMessageSend.java 功能:主要实现用户间发送消息 主要方法: 1、 void jButton2_actionPerformed(ActionEvent e) 作用:发送消息响应事件 处理逻辑:创建消息包, 发送消息包, 将发送消息添加到聊天记录中。 类名:类名:AddFriend.javaAddFriend.java 功能:主要实现处理添加朋友信息的功能 主要方法: 1、 public class AddFriend implements Serializable 作用:将AddFriendBox中的加对方为好友的理由和用户和对方号码串行化。 类名:类名:AddFriendBox.javaAddFriendBox.java 功能:主要实现添加朋友的界面 主要方法: 1、 private void jbInit() 作用:初始化添加好友对话框 2、void jButton1_actionPerformed(ActionEvent e) 作用:向对方发送添加信息 类名:类名:Find.javaFind.java 功能:主要实现查找用户的界面 主要方法: 1、 private void jbInit() 作用:初始化查找对话框 2、void findbutton_actionPerformed(ActionEvent e) 作用:用号码查找,并添加其为好友 处理逻辑:如果对方在线就发送添加好友信息,对方确认后,系统添加,否则 对发不在线就留言等待,等对方确认后,系统添加。 类名:类名:FindResult.javaFindResult.java 功能:主要实现查找用户的结果 主要方法: 1、 private void jbInit() 作用:处理查询结果 处理逻辑:连接服务器读取信息,然后用表格形式显示出来。 类名:类名:MessageReceive.javaMessageReceive.java 功能:主要实现用户聊天信息的接受 主要方法: 1、 public MessageReceive (Socket s) 作用:接收消息并且将消息显示在聊天记录中 2、 private void receive() 作用:接收消息 3、 private void showMessage() 作用:将消息显示在聊天记录中 处理逻辑:判断此时与发送消息的蜜友的聊天对话框是否已经打开, 打开,则 将Mesage显示在已经打开的聊天记录中, 没有,则打开并显示。 4.2.2 类的 UML 图 图 4.2 类的 UML 图 4.3 应用功能的设计 4.3.1 新用户的注册 当服务器收到用户的注册请求,便开始接受客户传第的信息,诸如客户的呢称 啦, 性别, 籍贯,头像,个人资料等,接受完毕后,便通过 JdbcOdbc 与后台数据库连接, 然后向数据库添加记录,如果成功,便向客户返回其 qnum 号码,客户收到服务器返 回的信息后,便打开主程序窗口。 程序流程图 4.3 如下: 客户 端登 陆框 服 务 器 端 注 册 页 面 客户 端主 界面 点 击 注 册 填 写 信 息 信 息 处 理 Login MainWinRegister AddFriendFindResult MessageSend AddFriendBox Find MessageReceive 表示依赖关系表示关联关系 1 查询 1 1 接受 n 1 显示 1 1 添加 1 1 处理 1 1 登陆 1 1 注册 1 1 发送 n 1 登陆 1 图 4.3 新用户的注册程序流程图 4.3.2 登陆 在客户端,用户输入其 qnum 号码和密码,然后建立与服务器的连接,告诉服 务器我要登录,服务器收到后,开始通过 JdbcOdbc 读取数据库,然后与用户输入的 信息比较,如果相同就向客户返回成功消息并将其 Status 字段设为表示上线了, 否则返回错误,如果客户收到成功信息就打开主窗口,否则提示出错。如果成功, 便打开主程序窗口,并同时开始创建 UDP 以便在用户之间建立联系。然后客户向服 务器请求读取好友、陌生人和黑名单,服务器收到该请求,开始读取数据库中的 friend 表、stranger 表和 blacklists 表,得到好友、陌生人和黑名单的号码后,再在表 中读取好友、陌生人和黑名单资料,然后向客户端发送这些信息,客户收到后就在 主窗口显示好友、陌生人和黑名单,比如头像,呢称。并且建立几个矢量(Vector) 用以存储好友的呢称,qnum 号码,头像编号,ip 地址等信息。 程序流程图如图 4.4 下所示: 图 4.4 登陆程序流程图 4.3.3 查询朋友 客户登录后,按查找按钮后,开始向服务器发出查找请求,服务器读取数据库 表 personalinfo 并向客户返回其结果,客户收到后在查找窗口中显示,如果用户选择 了一个好友,就向服务器发送添加好友请求,服务器收到后就向数据库表 friend 中 添加自己的号码以及好友的号码,并从 personalinfo 表中读取其基本信息返回给客户 端,然后客户收到并在主窗口显示该好友。并且通过 UDP 通知该客户,对方收到该 消息后,可以选择添加该用户为好友或者不。 核心程序的流程图如下图 4.5 所示: 客 户 端 填写信 息发送 到服务 器 服 务 器 端 服务器 对客户 信息处 理结果 客 户 端 客户端主界 面或者提示 错误并进入 登陆界面 客 户 端 服 务 器 端 查找请 求发送 到服务 器 服务器 处理请 求的结 果发到 客户端 客户 端查 找结 果页 面 客户端通过 UDP 来添加 好友并将添 加的资料送 至数据库 服务 器处 理该 信息 图 4.5 查询朋友核心程序的流程图 4.3.4 聊天消息的接受和发送 用户之间通过 UDP 连接来实现用户间的通讯.每个用户在该聊天工具进入主界面 时便创建一个线程,无限监听其他好友发来的消息,如果某个好友发来消息,便接受该消 息并弹出聊天界面和显示其发来的消息. 聊天消息的接受的部分的核心程序流程如下图 4.6 所示: 图 4.6 聊天消息的接受的部分的核心程序流程 聊天消息的发送的部分的核心程序流程如下图 4.7 所示: 图 4.7 聊天消息的发送的部分的核心程序流程 4.3.5 服务器端的设计 服务器与客户间通过套接口 Socket(TCP)连接。在 java 中使用套接口相当简单, Java API 为处理套接口的通信提供了一个类 .Socket.,使得编写网络应用程序相 对容易服务器采用多线程以满足多用户的请求,通过 JDBC 与后台数据库连接, 并通过创建一个 ServerSocket 对象来监听来自客户的连接请求,默认端口为 8000, 然后无限循环调用 accept()方法接受客户程序的连接。 服务器程序核心部分的流程如下图 4.8 所示: 客户端 中实现 UDP 的 线程 线程 无限 监听 接到信息 弹出的聊 天界面和 显示的信 息 线程 继续 监听 客户端 中聊天 界面 输入 聊天 的信 息 建立 Socke 实现通信并 发送聊天的 信息 服 务 器 端 创 建 一 个 线 程 线 程 无 限 监 听 客 户 请 求 收到 请求 Login 收到 请求 new 收到 请求 Find 结 束 程 图 4.8 服务器程序核心部分的流程图 44 主要界面设计 44,1 登陆框的设计 图 4.9 登陆框界面 442 聊天界面的设计 好友 Ip 地址 图 4.10 聊天界面 443 主界面的设计 处理用户登 陆信息 处理用户注 册信息 处理用户查 找信息 欢迎所有本聊天工具登陆 用户号码 用户密码 用户登陆 用户注册 与 1000054 的聊天 好友网名好友图象好友号码好友 Ip 地址 聊天的信息 要发给对方的信息 重填信息发送信息 QQ 图象 我的 QQ 号码 我的好友 黑名单 图 4.11 主界面 444 注册框的设计 图 4.12 注册框界面 5 软件功能测试 由于本设计是一个比较简单的聊天工具,在程序运行后只需要设计几个简单的用 例: 用户登陆: 用户号码用例 数字:500054,数字中含有字符:50054q 登陆密码用例 少于 6 位密码:12345;多于 6 位密码:1234567;正确的密码:123456; 错误的密码:123457 用户注册 用户密码用例 同登陆密码用例相似 陌生人 查找好友我的资料我的状态 用户的注册 用户名 用户密码 密码确认 用户图象 用户性别 用户地址 用户 EMAIL 确认提交重新填写 用户密码确认用例 同登陆密码用例相似并且还要设计与第一次输入的密码是否 一致的用例 聊天实现的用例 设计与某人聊天即给某人发消息某人是否能收到消息的用例,比如 500051 给 500052 发消息”你好!” . 用户交友的用例 在好友添加框里输入要添加的用户号码,经过添加的过程处理后,看好友列表里是 否显示添加该用户号码.比如:500055 经过一系列用例测试后,本聊天工具均能正确处理,得出正确的结果。 6 总结 6.1 设计体会 通过这次毕业设计,我学到了很多.我以前学过JAVA这门课程,也做过关于JAVA 的简单的程序,但是这次的设计对我来说是一个比较大的挑战,我还是头一次做这么复 杂的设计.通过这次设计我主要学到了客户端和服务器的通讯,还有学到了遇到困难应 该怎样解决的方法. 6.2 实现中所遇到的问题 我在此次设计的过程中遇到了许多困难,通过我的反复思考终于得到了解决.比 如:用户登陆以后用户好友数据的加载到主界面中,刚开始用户好友资料始终不能显示,开 始我怀疑客户端发出的消息服务器端没有处理,也就是说没有查询数据库即没有查询 用户的好友号码.但是经过我仔细的查看源代码,发现并没有错误,我又怀疑是不是服务 器发送到客户端的过程中出现了问题,但是服务器发出的好友号码已经保存到客户端 的vector对象中,所以此过程也没有问题.最终, 是从vector对象中读出信息没有加载到 客户主界面. 6.3 今后研究的方向 由于设计的时间有限,本系统只具有简单的聊天注册登陆和查询好友的功能.至 于视频聊天文件传输等功能只是简单的写了一些代码,但是还是有些不懂的地方,所 以其功能没能实现.以后时间宽裕的话,必解决其困难,完善其功能。 参考文献 1张跃平.JAVA 2 实用教程(第二版)M .北京:清华大学出版社. 2Darwin. JAVA 经典实例M .北京:中国电力出版社. 3杨宗志.JBuilder 程序设计实例M .北京:清华大学出版社. 4周颕,牛允鹏.网络编程语言 JSP 实例教程M .北京:电子工业出版社,2002 年. 5摆渡人工作室.在线聊天室与 BBS 的设计开发M .北京:机械工业出版社,2001 年. 6张曜,Java 程序设计教程M .北京:冶金工业出版社. 7姜利群. Java 网络编程实例教程M .北京: 北京交通大学出版社. 致 谢 感谢。 附录 1 注册功能的部分代码如下: try Socket socket = new Socket(“localhost“, 8000); BufferedReader in = new BufferedReader(new InputStreamReader(socket. getInputStream(); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true); out.println(“login“); out.println(PNTextField.getText().trim(); out.println(PW.getPassword(); String str=“ “; str=in.readLine().trim();/从服务器读取消息 in.close(); out.close(); socket.close(); /如果失败就告诉出错 if(str.equals(“false“) JOptionPane.showMessageDialog(this,“对不起,出错了:-(“,“ok“, JOptionPane.INFORMATION_MESSAGE); else/如果成功就打开主程序 int qno = Integer.parseInt(PNTextField.getText().trim(); this.dispose(); MainFrame mainframe=new MainFrame(qno,“localhost“, 8000); mainframe.setSize(600,250); Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); int screenWidth=screenSize.width; int screenHeight=screenSize.height; Dimension frameSize=mainframe.getSize(); int x=screenWidth-frameSize.width; int y=0; mainframe.setLocation(x,y); mainframe.setResizable(true); mainframe.setVisible(true); catch (IOException ex) 2 登陆功能的部分代码如下: try Socket socket = new Socket(“localhost“, 8000); BufferedReader in= new BufferedReader(new InputStreamReader(socket.getInputStream(); PrintWriter out=new PrintWriter( new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); out.println(“new“);/发送新建用户请求 out.println(this.petname.getText().trim(); out.println(this.password.getText().trim(); out.println(.getText().trim(); String sex=“; if (male.isSelected() sex+=“男“; else sex+=“女“; out.println(sex); System.out.println(sex); out.println(this.email.getText().trim(); out.println(headpic.getSelectedIndex(); int no; no = Integer.parseInt(in.readLine().toString().trim(); System.out.println(no); String str1=“; str1=in.readLine().trim();/从服务器读取信息 /如果出错 if(str1.equals(“false“) JOptionPane.showMessageDialog(this,“对不起,出错了:-(“,“ok“, JOptionPane.INFORMATION_MESSAGE); else/如果成功就告诉用户其号码 JOptionPane.showMessageDialog(this, “your M num is “ + no, “ok“, JOpti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论