毕业论文终稿1-09级-电子信息程(2)班-李毅113

更新时间:2023-09-14 02:02:01 阅读量: 教学研究 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学 号 分类号 2009222413 TP311

本科生毕业论文(设计)

题目: 基于java的即时通信软件设计与实现

院 (系) 电子与信息工程系 专 业 电子信息工程 班 级 2009级2班 学 生 姓 名 李 毅 指导教师(职称) 王克刚(副教授) 提 交 时 间 二〇一三年五月

版权声明

任何收存和保管本论文各种版本的单位和个人,未经本论文作者同意,不得将本论文转借他人,亦不得随意复制、抄录、拍照或以任何方式传播。否则,引起有碍作者著作权之问题,将可能承担法律责任。

原创性声明

本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品或成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明,本声明的法律结果由本人承担。

论文作者签名: 日期: 年 月 日

安康学院本科生毕业论文(设计)

基于java的即时通信软件设计与实现

李 毅

(安康学院电子与信息工程系,陕西安康,725000)

摘 要 计算机网络技术高速发展的今天,即时通讯越来越方

便,使得通信软件也变得越来越重要,所以本文做了一个即时通信软件,该软件主要是基于Java平台,采用C/S结构客户端和服务器端通过Socket发送和接收消息,并遵循java的面向对象的设计原则。该软件使用MyEclipse开发工具,服务器端的设计和实施过程中,使用多线程技术,它可以在一个程序中同时运行多个不同的线程,执行不同的任务,大大提高服务器资源的利用率。数据库管理系统用Oracle完成,并通过JDBC桥访问数据库。聊天系统将完成好友登陆、验证登陆、多人互相聊天、新用户注册、添加好友、删除好友、修改个人资料等功能。

关键词 即时聊天;系统;Java;C/S

安康学院本科生毕业论文(设计)

Instant communication software Design and Plementation

Based on Java

LI YI

(Department of Electronic and Information Engineering, Ankang

University, Ankang, 725000)

Abstract With the rapid development of computer network technology

nowadays, instant communication becomes more and more convenient. So software for communication is more and more important at the same time. This paper is about a instant communication software. The software is mainly based on Java platform. using C/S structure, and its client and server receive messages through the Socket to send, objecting the principles of Java. What’s more, My Eclipse is used in the software as the development tools, and in the process of design and implementation, the server uses the multi-threading technology, which can be a number of different threads running simultaneously in a program, making it perform different tasks, and greatly improving the server resource utilization. Database management systems, completes with Oracle, and make an access to the database through the JDBC bridges. Chat system has the function of friends logining. Verifying logining, multi-chat with each other, and the new user registration, add friends, delete friends, modify personal information and other functions.

Key Words Instant Messager; System; JAVA; C/S

安康学院本科生毕业论文(设计)

目 录

第一章 绪 论 .............................................................................................. 1

1.1 引言 .................................................................................................................1 1.2 课题研究背景 ..................................................................................................1 1.3 系统实现的关键技术 .......................................................................................2 1.4 本文工作及内容安排 .......................................................................................3

第二章 系统的需求分析 ............................................................................. 5

2.1 项目设计的需求描述 .......................................................................................5 2.2 服务器端需求 ..................................................................................................5 2.3客户端需求 .......................................................................................................5 2.4 对于发送的消息的一些协议需求 .....................................................................5

第三章 系统设计 ........................................................................................ 7

3.1 软件设计流程 ..................................................................................................7 3.2 即时聊天系统的实施原理 ................................................................................7 3.2.1 工作方式和技术原理.....................................................................................7 3.2.2 通讯方式 .......................................................................................................8 3.3 功能模块划分 ..................................................................................................9 3.3.1 服务器端 ....................................................................................................9 3.3.2 客户端 .......................................................................................................9

第四章 数据库概要设计 ........................................................................... 11

4.1 系统实体及实体关系图 .................................................................................. 11 4.2 用户表 ............................................................................................................ 12 4.3 好友表(friends) .............................................................................................. 12 4.4 在线状态表(logtype) ...................................................................................... 13 4.5 登陆表 ............................................................................................................ 13 4.6 离线信息表 .................................................................................................... 13

第五章 详细设计 ...................................................................................... 15

5.1 服务器端的设计与实现 .................................................................................. 15 5.2 用户注册模块 ................................................................................................ 16 5.3 登陆模块 ........................................................................................................ 17 5.3.1登录模型图 ............................................................................................... 17 5.3.2登录验证 ................................................................................................... 17

安康学院本科生毕业论文(设计)

5.4 添加好友、删除好友、修改个人资料模块 .................................................... 20 5.5 发送和接收消息模块 ..................................................................................... 21 5.5.1 聊天流程 .................................................................................................. 21 5.5.2发送和接收消息 ........................................................................................ 22 5.6 关闭客户端 .................................................................................................... 23

第六章 系统测试 ...................................................................................... 25

6.1 系统测试案例 ................................................................................................ 25 6.2 测试结果和分析 ............................................................................................. 25

第七章 总结与展望 ................................................................................... 29 参考文献 .................................................................................................... 30 致 谢 ....................................................................................................... 31 附 件 ....................................................................................................... 32

第一章 绪论

第一章 绪 论

1.1 引言

随着科学技术的发展,人类目前已经处于信息时代。人和人之间的信息交流具有了多种途径。不仅可以面对面的直接交流,还可以借助于一些先进的工具如电话、网络等实现远程交流。人们最为熟悉的QQ就是实现远程交流的应用典范。针对企业的专业化即时通讯也迅速成长,具备安全性和多用途的互动办公通讯软件平台随之诞生,它们大都集成文字、声音、视频、屏幕、即时邮件、文件共享与下载的诸多功能,能满足用户的各种需要。并且即时通讯技术有将无线通讯融入计算机网络的趋势,其前景是非常光明的。本课题研究的是支持内部网络交流的系统——网络即时通讯系统。

1.2 课题研究背景

即时通讯系统是一种非常便捷的网络通讯技术,利用互联网建立起网络虚拟环境,通过计算机键盘或无线设备在网络上进行实时信息交流,成为一种提供公共通讯、商务通讯及商务合作的新媒介,同时也弥补了传统通讯形式的不足,尤其是电子邮件及语音通信方面的不足。即时通讯工具在实现传输视频与音频信息,使协作成员可以远距离进行直观、真实的文字交流的同时,利用多媒体的技术,它还可以帮助使用者对工作中各种信息进行处理。随着即时通信普及,全球即时通信用户的数量也不断增长。

目前即时聊天系统种类众多,功能也较为齐全,但MSN、QQ等公共消息系统,由于聊天对象及内容的不可控,若在企业内部使用,可能会降低工作效率。本文所研究的即时通讯系统的应用目标定位于企业内部网络,将自己的服务器端安装在企业内,并且人员的创建是由系统管理员来完成,因此很好的解决企业或单位的信息沟通及协同问题,提高工作效率。在该系统中,企业内部员工可以利用该通讯系统随时随地发送文字消息,系统包括客户端程序和服务器端程序,支持局域网和Internet。企业内部员工之间可以在内部网覆盖的任何地点、任何时间进行即时交流,帮助实现企业内部协同工作。

即时通讯带给了更大的互动性,人们在交流彼此的看法、意见时,发现采用你来我往的方式达到的效果最为明显。这就体现了互动性。通过使用及时通讯系统,大家不需要借助其它额外的工具,

1

安康学院本科生毕业论文(设计)

就可以在线实时地交流工作,即时通信软件是网络软件的一个重要应用,构造的成本低、实时性好、网上交流平台便捷的特点决定了它的普及性,使其成为了在互联网上和他人联系的重要方式,应用于企事业单位内部的即时通讯软件,可以推动政府机构、大型事业单位信息化的建设!因此开发该类型即时通讯软件也就具有重要的意义。

1.3 系统实现的关键技术 (1) 系统开发语言选择

经过认真的讨论分析,最终决定选择纯面向对象的Java语言来完成本项目的设计和实现,下面对Java语言作简要介绍。

Java是一种简单、多线程、安全、容易适用、可移置、面向对象、高性能的语言。具有以下特点:

面向对象:面向对象技术可以提高模块化程度和重复使用率,缩短软件开发时间降低开发成本。

安全性:Java提供了许多安全机制,是一种能应用于网络和分布环境下的程序设计语言。

多线程:Java具备内建的多线程功能使各线程并发、独立执行提高系统的运行效率。

平台独立:平台独立是指程序不受操作平台限制可以应用于各种平台。Java源程序经过编译后能够生成字节码文件,字节码和具体的计算机无关。计算机安装能解释执行字节码的JVM就能执行字节码文件实现了Java的平台独立性。

执行效率: Java程序的开发通常需要经过编写源程序、编译生成字节码和运行三个过程。这一编译过程同C/C++的编译有些不同,C编译器编译时,该代码是为在某一特定硬件平台运行而形成的,在编译过程中,编译程序通过查表将所有对符号的引用转换为相应的内存偏移量,以保证程序运行。而Java编译器却不将对方法和变量的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。Java应用程序的开发周期包括编译、下载、解释和执行几个部分。这样就有效的保证了Java的运行效率。

(2) 系统架构

经过分析,我采用的软件架构是C/S架构, C/S就是指客户机

2

第一章 绪论

/服务器模式,客户机向服务器发出数据请求,服务器将数据进行计算,计算完毕后,将计算结果返回给服务器,形成客户端和服务器之间的交互。具体的讲,就是在主机终端模式中,把原来全部集中在主机部分的任务一分为二。一部分是仍然保留在主机上的负责集中处理和汇总运算,成为服务器;而另一部分是下放到终端的部分,主要负责为用户提供友好的交互界面,称为客户机。相对于以前的模式,C/S模式最大的改进是不再把所有软件都装进一台计算机,而是把应用系统分成两个不同的角色和两个不同的地位,一般在运算能力较强的计算机上安装服务器端程序,而在一般的PC上安装客户机程序,这样就可以把主机端的一部分工作放在客户机端完成,从而减轻了主机的负担,也增加了系统对用户的响应速度和响应能力,从而提高工作效率。这种模式的优点充分利用了客户机的性能,使计算能力大大提高;另外,由于客户机和服务器之间的通讯是通过网络协议进行的,是一种逻辑的联系,因此在物理上客户机和服务器两端是易于扩充的。

(3) 信息通信技术

本系统实现信息通信主要是用Socket来实现的,Socket是网络编程中最常见的客户/服务器模式。可以想象一条虚拟的电缆工作在两台计算机之间,两台计算机都有一个Socket,也就是端口,电缆插在两台计算机的Socket上,一台计算机上的Socket同另一台计算机通话创建一个通信信道,我们可以利用这个信道在两台机器之间发送数据。用该模式编程时,服务器端有一个进程或多个进程在指定的端口等待客户来连接,一旦连接成功,便按设计的数据交换方法和格式进行数据传输。客户端向服务器端提出连接请求,连接之后进行通信。

1.4 本文工作及内容安排

本文主要是通过java语言以及局域网实现一个QQ聊天系统。第一章介绍了论文的课题背景,阐述了课题的目的与意义,概述了项目设计实现所要采用的一些关键技术;第二章对系统的需求进行分析,主要包括即时聊天消息的功能需求,即时消息的协议需求,即时信息加密和鉴别等通信息安全方面的需求;第三章介绍了系统设计,即时聊天系统的实施原理,软件设计流程,功能模块划分;第四章介绍了数据库的概要设计;第五章详细设计,服务器端的设计与实现,注册处理模块,客户端的设计与实现,以及聊天信息发

3

安康学院本科生毕业论文(设计)

送与接收;最后一章对本文所做的工作进行全面的总结,并指出了工作中的不足。

4

第二章 系统的需求分析

第二章 系统的需求分析

2.1 项目设计的需求描述

设计一个基于JAVA的网络即时通信系统,在通用计算机网络

上实现信息传递,包括基本的文本消息传递,实时获取联系人状态,对常用联系人进行管理等。主要考虑以下基本功能,注册并登录服务器,验证用户,获得用户列表,用户运行客户端程序后,服务器端程序在局域网上运行,与其他用户进行点对点的实时消息通信服务。

2.2 服务器端需求

处理用户登录,当用户到达登陆界面时,用户发送账号、密码等信息进行分装,服务器接受到用户发送的登陆账号、密码;验证用户登录,服务器将用户登陆发送的账号和密码,与数据库中已有的用户进行匹配,如果能能找到,那么就验证成功,找不到该用户,验证失败;处理用户发送信息和处理用户得到信息,用户可以通过对话框和自己的好友进行文字类的交流,可以发送消息,同时也可以接受好友消息;处理用户退出,关闭服务器等。

2.3客户端需求

用户注册界面及结果,可以将用户的姓名、性别、年龄等信息分装,添加到用户数据表中,然后用户可以根据注册的账号、密码进行登录;用户登录界面及结果,用户进入登陆界面,填写自己的账号、密码,然后将其提交给服务器;用户验证界面及结果,根据服务器验证的结果,验证成功,用户可以进入登陆成功界面,验证失败,用户会得到一个登陆失败界面;用户发送信息界面及结果,用户可以双击自己的好友,然后弹出一个对话框,可以和自己的好友进行交流;用户得到信息界面及结果,当好友给自己发送消息时,用户自己的好友界面端,好友头像闪动,然后点击好友头像上,就可以接受到好友的消息。

2.4 对于发送的消息的一些协议需求

发送的消息必须至少使用一种消息格式,格式必须包含一个让接收者可以回消息的地址、发信者和即时收件箱的标识,以及允许对信息有效负载的编码和鉴别(非ASCII内容),而且即时消息格式必须提供扩展和注册即时消息格式的模式机制。这种模式机制,可

5

安康学院本科生毕业论文(设计)

以保证即时消息成功投递或者投递失败的时候,发信者获得足够的信息。即时通讯协议,是指参与的双方或者多方通讯时所达到的共识。协议必须是双方或者多方参与的,一方单独完成的就不算协议。这样在协议动作的过程中,双方必须交换信息,包括控制信息、状态信息等等。这些信息的格式必须是协议参与方同意并且遵循的。好的协议要求清楚、完整,每一步都必须有明确的定义,并且不会引起误解;对每种可能的情况必须规定具体的动作。本文的即时通讯协议必须提供方法保证即时消息的置信度,让即时信息未被监听、破坏、重排序或者回放,同时还必须保证即时消息被正确的实体阅读。

6

第三章 系统设计

第三章 系统设计

3.1 软件设计流程

因为该系统其需求是十分明确的,所以该系统的开发流程采用瀑布模型进行设计,分为几大步骤:先进行需求分析,再是系统设计,然后是详细设计与编码,其次是软件的测试,最后是软件的运行和维护。在实际过程中这些步骤经常是重叠和彼此间有信息交换,它不是一个简单线性过程,而是包括开发步骤的多个反复。如图1所示。

需求分析 系统设计 详细设计与编码 软件测试 软件运行与维护

图1 即时通讯系统开发瀑布图

3.2 即时聊天系统的实施原理 3.2.1 工作方式和技术原理

第一步,用户输入自己的用户名和密码登录服务器,服务器通过读取用户数据库来验证用户身份,如果验证通过,登记用户的IP地址、客户的姓名及时间,然后返回用户登录成功的标志。

第二步,根据用户存储在服务器上的好友列表,服务器将用户在线的相关信息发送给也同时在线的好友的PC机,这些信息包括在线状态、IP地址等,好友的客户端收到此信息后将其显示在客户端界面上。

7

安康学院本科生毕业论文(设计)

第三步是服务器把用户存储在服务器上的好友列表及相关信息回送到他的客户端机,这些信息包括也在线状态、IP地址等信息。用户应用流程图如图2所示。

新用户注注册验证 成功 用户登陆 成功 身份验证 失败 失败 注册失败 登陆成功 登陆失败 与好友聊天 关闭聊天窗口

图2 用户体验流程图

关闭客户端 3.2.2 通讯方式 (1)在线直接通讯

如果用户想与他的在线好友用户聊天,他将直接通过服务器发送过来的用户好友的IP地址、TCP端口号等信息,直接向用户好友的PC机发出聊天信息,用户好友的客户端软件收到后,头像闪动,双击弹出对话框,显示在屏幕上,然后用户好友再直接回复到用户的PC机,这样双方的即时文字消息就不在服务器中转,而是直接通过网络进行点对点的通讯。

(2)在线代理通讯

用户与用户好友的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢,服务器将会主动提供消息中转服务,即用户

8

第三章 系统设计

和用户好友的即时消息全部先发送到服务器,再由服务器转发给对方。

3.3 功能模块划分 3.3.1 服务器端

服务器端完成至少3大功能:建立连接、存储数据和监听客户。这3大功能的具体含义如下:

(1)建立一个ServerSocket连接,不断侦听是否有客户端连接或者断开连接。

(2)服务器端是一个信息发送中心,所有客户端的信息都传到服务器端,再由服务器根据要求分发出去。

(3)数据库数据操作包括将用户信息存储到数据库等。 服务器端功能结构如图3。

服务器存储数据 建立连接 监听客户 图3 服务器端功能结构图

3.3.2 客户端

客户端要完:用户登录、读取用户、通信交流这些功能。这些功能的含义如下:

(1)用户登录:客户端与服务器端建立通信信道,向服务器端发送信息,完成用户登录。

(2)通信交流:客户端可完成的信息的编辑、发送和接收等功能。该即时聊天工具按如下过程完成通信,客户向服务器登陆,告知服务器该客户监听某主题;客户登陆之后,向服务器发送消息;服务器再把消息发送给所有监听此主题的客户。

客户端功能模块结构如图4

9

安康学院本科生毕业论文(设计)

客户端 用用用证用读户户户注注户取册册登登用 验陆 陆户 证验 图4客户端功能模块图

10

用户交流

第四章 数据库概要设计

第四章 数据库概要设计

4.1 系统实体及实体关系图

经过本人对系统数据信息的分析,设计了有用户实体、好友列表实体两个实体。用户实体属性包括了用户编号、昵称、密码、签名、性别、生日、在线头像、离线头像、消息头像等;好友列表实体包括了功能ID、用户编号、好友编号等属性。用户好友实体和好友列表实体E-R图如图5。

qq编号 昵称 签名 性别 密码 生日 用户 1 离线头像 在线头像 拥有 消息头像 n 好友 编号 自己编号 好友编号

图5 实体关系图

根据实体关之间系,数据库设计了用户表(登录用户)、好友表(friends),另外为了方便编写用户的登陆状态和直观的表示服务器端,又添加了在线状态表(logtype)和登陆表。用的数据库是oracle10,对数据库表进行操作的软件工具是PLSQL Developer,下面将对这五张表进行详细说明。

11

安康学院本科生毕业论文(设计)

4.2 用户表

用户表主要是记录每个用户自己的信息,包括自己的qq号、昵称、密码、签名、性别、生日、在线头像、离线头像、消息头像等这些字段。其中qqnum和qqsex为数字类型,qqname、qqpass、qqdesc为字符串类型,而在线头像、离线头像、消息头像是大数据类型,生日是日期类型,主键是qqnum。主键为了标识一条记录的唯一性,保证每条记录应当具备惟一性,一张表里只有一个主键,而且主键不能为空,如表1。

表1 用户信息表

标识 编号 昵称 密码 签名 性别 生日 在线头像 离线头像 消息头像

字段 qqnum 类型 number 精度 10 20 20 100 1 是否主键 是否外键 是 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 否 qqname varchar2 qqpass varchar2 qqdesc varchar2 qqsex qqbirthday qqolpic qqofpic qqmespic number date blob blob blob 4.3 好友表(friends)

好友表主要反应的是该qq好友和好友之间的关系。friid、qqnum、frinum都是数字类型的。其中friid是主键,qqnum是外键。外键表示了两个关系之间的联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。主键与外键用于区分不同的记录便于查询。外键又称作外关键字。一张表中可以有多个外键,但这些外键必须是其它表的主键,如表2。

12

第四章 数据库概要设计

表2 好友表

标识 功能ID 编号 好友编号 字段 Friid Qqnum Frinum 类型 number number number 精度 10 10 10 是否主键 是否外键 是 否 否 否 是 是 4.4 在线状态表(logtype)

在线状态表主要是反应用户的登陆状态的表。Typeid是数字类

型,typename、typedesc是字符串类型。其中初始化数据时,10代表离线,11代表隐身,12代表在线,如表3。

表3 在线状态表

标识 状态ID 状态名称 状态描述 字段 typeid 类型 number 精度 2 10 是否主键 是否外键 是 否 否 否 否 否 typename varchar2 typedesc varchar2 100 4.5 登陆表

登陆表主要是将登陆的用户信息反映到服务器端,服务器端显示每个登陆的用户信息。其中qqnum、typeid是字符类型的,logip是字符串类型的,logtime是日期类型的,而且qqnum即时这张表的主键,也是这张表的外键,同时typeid也是这张表的外键,如表4。

表4 服务器端登陆表

标识 编号 状态ID 登陆IP 登陆时间 字段 qqnum typeid logip logtime 类型 number number varchar2 date 精度 10 2 15 是否主键 是否外键 是 是 是 4.6 离线信息表

离线表主要是方便用户不在线时,将离线信息存储在这个表

中,当用户登录时,将信息显示给用户。其中ID是number类型的,fromuserid、touserid、message是字符串类型的,同时编号ID是这张表的主键。如表5。

13

安康学院本科生毕业论文(设计)

表5 离线信息表

标识 编号 字段 Id 类型 number 精度 10 10 10 是否主键 是否外键 是 用户账号 fromuserid varchar2 好友账号 留言信息 touserid varchar2 message varchar2 100 14

第五章 详细设计

第五章 详细设计

5.1 服务器端的设计与实现

C/S模式下的系统开发,很显然服务器端程序的设计是非常重要的。下面就服务器端的相关程序模块进行设计,并一定程度上实现了相关功能。使用SeverSocket s=newServerSocket(端口)语句在端口创建套接口;使用new ServerThread(socket)语句创建新的线程。服务器类调用ServerThread类,而每个ServerThread实体就是一个独立的线程,刚好对应于客户端的连接请求响应线程。每一个客户登陆,如果验证成功,将会显示在服务器端。为了更好的显示后台服务器端,设计了相应的服务器端图形界面,如图6。

图6 服务器端界面

当服务器打开时会同时监听登陆线程(LoginListener)类、监听消息线程(MesListener)类这三个线程。

登陆线程(LoginListener)类主要是负责服务器的用户登陆显示、发送给登陆用户好友列表、发送给登陆用户其在线好友,通知上线信息等。

在服务器的登录表注册登录,并更新登陆显示的主要代码为:

win.getDao().addLoginUser(lm);

win.setTmodel(win.getDao().getLoginModel()); win.getTab().setModel(win.getTmodel());

发送给登陆用户好友列表的主要代码为:

15

安康学院本科生毕业论文(设计)

ArrayList

friList=win.getDao().getFriendsList(lm.getQqnum());

SendModel.sendFriList(lm, friList); MesModel if(mm!=null){

SendModel.sendMes(mm,

win.getDao().deleteMes(lm.getQqnum());

}

lm.getQqip(),

发送给登陆用户留言

mm=win.getDao().getmesModelByID(lm.getQqnum());

FinalFile.CLI_MES_PORT);

5.2 用户注册模块

当用户使用Client界面,点击注册账号,用户要把个人资料填写完,此时有一个注册类线程开启,同时验证用户填写的个人资料是否合法。如果合法,将注册的信息插入到用户表用户中,同时还会将申请的账号返回给用户,用户可以通过这个账号和自己注册的密码进行登录。如果不合法,系统拒绝申请,返回到登陆界面。注册模块图如图7。

图7 用户注册模块图

注册好友的方法如下所示。

注册不成功界面 返回给用户一个编号 注册不规范 用户注册验证 注册规范 用户注册 public void LoginId( String qqname,String qqpass,String qqdesc,int qqsex,String qqbirthday){

String sql=\into qquser values(sq_user.nextval, '\

16

第五章 详细设计

_date( '\dbutil.executeDML(sql); } 5.3 登陆模块 5.3.1登录模型图

当用户使用账号和密码进行登录,这时候有一个登录线程将用户发过来的用户信息和后台数据库里的用户信息进行比对。如果用户的账号和密码与之完全匹配,则用户成功登录,并且返回给用户登录账号的好友列表、好友资料、好友状态。如果不匹配,服务器则告知登陆的用户登录失败。用户登录活动图8。

图8 登陆模型图

显示好友界面 返回到登陆失败界登陆成功 登陆失败 登录用户 验证登陆 5.3.2登录验证

利用JFrame类写一个登陆界面类(ClientFrame),在登陆界面类给所有的按钮添加监听事件类(LoginFrameHandler)。点击登陆进入验证登陆环节,将登陆界面获取的登陆账号、密码、状态全部用一个登陆用户类(LoginModel)分装起来,然后写一个方法,根据获取的账号和密码,从数据库中查找,如果能找到,那么说明有这个用户,用户进入登陆成功,显示好友界面这一环节;如果根据账号和密码,从数据库中找不到该用户,那么说明密码和账号有问题,这时提示输入密码和账号有问题,请关闭当前提示,请重新登陆。

17

安康学院本科生毕业论文(设计)

实现验证登陆功能方法的代码如下。 public boolean isEnter(LoginModel lm){

String

sql=\

qqnum

from

qquser

qqnum=\qqpass='\

dbutil.setSet(dbutil.executeQuary(sql)); try {

if(dbutil.getSet().next()){

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace(); } finally{

dbutil.closeAll();

}

return false;

}

发送登陆信息的代码方法如下。

public static void sendLogin(LoginModel lm) {

try {

socket=newSocket(FinalFile.SER_IP, FinalFile.SER_LOGIN_PORT); objout

=

ObjectOutputStream(socket.getOutputStream());

objout.writeObject(lm);

} catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace(); } finally {

closeAll();

18

where and

new

第五章 详细设计

}

}

如果上面的验证登陆成功后,那么就进入登陆成功这一环节,此时用JFrame类写一个客户端好友界面(ClientFrame),在这个好友界面里添加好友模型(FriendPanel),获取头像、姓名、签名。并在好友界面里添加监听好友模型线程类(FriListListener)、好友状态改变线程类(ChangeFriTypeListener)、以及消息线程(MesListener)。好友模型线程是为了获取好友的信息;好友状态改变线程是为了监听好友的装太多改变;消息线程是为了获取好友的消息。

好友模型线程(FriListListener)类主要是显示好友列表到界面、并刷新好友列表界面等功能。实现这一功能的主要代码如下所示。

ArrayListfriList=(ArrayList) objin.readObject();

win.getFrisPanel().setFrisView(friList); win.getFrisPanel().repaint(); win.getContentPane().repaint(); win.validate();

好友状态改变线程类(ChangeFriTypeListener)类,主要是将该边状态的好友重新显示在好友列表客户端,并对改变了的好友不断的刷新,这部分功能代码如下。

LogUnLogModel cm=(LogUnLogModel)objin.readObject(); ArrayList

fpList=win.getFrisPanel().getFriPanList();

for (FriendPanel friendPanel : fpList) { um())

{

friendPanel.getFriModel().setLogtype(cm.getLogType()); friendPanel.getPicLab().setIcon(friendPanel.getImage());

break; } }

if(friendPanel.getFriModel().getQqnum()==cm.getChangeQqn

19

安康学院本科生毕业论文(设计)

5.4 添加好友、删除好友、修改个人资料模块

用户点击添加好友按钮,这时会弹出一个添加好友画面,用户把自己要添加的好友写入到文本框里,客户端将其封装,然后交给服务器,将好友添加到好友表里,同时刷新客户端界面,可以实现添加好友。删除好友,将删除的好友获取后,从好友表中删除,同时刷新界面即可。修改个人资料,是将自己的新昵称、新签名、新密码获取,然后在用户表中更新,同时刷新客户端界面,便可实现设置个人信息。

添加好友的主要代码为:

public void addFriend(int num1,int num2){

String sql=\into friends values(sq_fir.nextval, \+num1+ \ dbutil.executeDML(sql); 删除好友的主要代码为:

public void deleteFri(int num1,int num2){ }

String

sql=\

from

friends

where

qqnum=\dbutil.executeDML(sql);

}

修改个人资料的代码为:

public void updateInfo(String name,int num,String desc ,String pass){

String sql1=\qquser set qqdesc='\where qqnum=\

dbutil.executeDML(sql1); sql=\

qquser

set

qqpass='\

where

String

qqnum=\

dbutil.executeDML(sql); sql2=\qqnum=\

}

dbutil.executeDML(sql2);

qquser

set

qqname='\

String

20

第五章 详细设计

5.5 发送和接收消息模块 5.5.1 聊天流程

用户登录成功后,双击好友,打开聊天面板,并填写聊天内容。消息先是由用户发送给服务器,然后由服务器转发给好友,在这里是有服务器获取到好友的ip,然后服务器将分装好的消息发送给这个ip和这个端口的好友,头像闪通,好友通过接收消息的端口接收消息,就可以实现两个用户之间的聊天。聊天流程图如图9。

获取到好友的ip

填写消息内容 好友接收消息 图9 聊天流程图

21

双击好友 开启服务器消息线程 开启客户端消息线程

打开对话框 服务器 安康学院本科生毕业论文(设计)

5.5.2发送和接收消息

登陆成功后,对每一个(FriendPanel)添加双击事件类(DoubleClickHandler), 双击对方头像后,将会出现和对方的一个对话框类(SessionFrame),并对此类的按钮添加一些监听事件,通过这个点击获取到对方的信息。发送消息主要是通过socket=new Socket(ip,port),将一个消息发送给这个ip和端口的好友。当然在此之前还要判断好友是否在线,如果在线,双击这个头像,弹出对话框。

写一个类(MesListener)用来接收消息,但这里必需用一个相同的端口接收消息,同时也是将接收到的消息转换成文字流。这个时候先判断这个消息对话框是否打开,如果这个会话框是打开的,那么显示消息,显示消息主要是将回话框里的文本文档用append添加进来。如果这个回话框没有打开,那么必须先闪动头像,把消息加入消息列表。

发送消息的方法代码为:

public static void sendMes(MesModel mes, String ip, int port) { }

try { }

socket = new Socket(ip, port); objout

objout.writeObject(mes);

// TODO Auto-generated catch block e.printStackTrace();

// TODO Auto-generated catch block e.printStackTrace(); closeAll();

=

new

ObjectOutputStream(socket.getOutputStream());

} catch (UnknownHostException e) {

} catch (IOException e) {

} finally {

客户端检查消息对话框是否打开、以及将消息加入消息列表的主要代码如下。

MesModel mes = (MesModel) objin.readObject();

22

第五章 详细设计

int friQQnum=mes.getQqnum();

for(FriendPanel fp : win.getFrisPanel().getFriPanList()){

if(fp.getFriModel().getQqnum()==friQQnum){ if(fp.getSession().isVisible()){

fp.getSession().getJtaG().append(MesUtil.getMesInfo(mes, fp.getFriModel().getQqname()));} else{

fp.getFsPane().getMesList().add(mes); fp.setMesPic();

}

}

} break;

5.6 关闭客户端

用户点击自己的客户端上的关闭按钮,此时需通知服务器下线,然后服务删除该用户,同时在服务器端,重新显示在线用户,并发送给登陆用户其在线好友,通知下线信息,即时刷新界面。关闭客户端流程图10。

服务器删除该在线用户

服务器端重新显示在线 图10 关闭客户端

好友刷新界面 通知登陆用户在线好友 关闭 删除登陆用户代码的主要方法为:

23

安康学院本科生毕业论文(设计)

public void unLoginUser(int qqnum) {

}

String sql = \dbutil.executeDML(sql);

24

参考文献

参考文献

[1] 尹治本.计算机网络及应用教程[M].成都:西南交通大学出版社.2002.8.

[2]熊晓敏,刘瑛,陈惠清.基于Java的网络即时通讯系统的设计与实现[J].计算机与现代化,2005(12): 89-92.

[3] 罗军舟,黎波涛,杨明,吴俊,黄健.TCP/IP协议及网络编程技术.北京:清华大学出版社.2005.8.

[4] Bruce Eckel著,侯捷翻译.Java编程思想[M].北京:机械工业出版社出版,2000.9.

[5] 京丽等.数据通信原理[M].北京:北京邮电大学出版社.2002.2. [6] 张虹.软件工程与软件开发工具[M].北京:清华大学出版社.2004. [7] BrueeEekel.ThinkingInJava(第三版)[M].北京:机械工业出版社.2005.

[8] Swing:David M.Geary著.Java图形设计卷二[M].Prentice Hall/Pearson.2000.2.1.

30

安康学院本科生毕业论文(设计)

致 谢

在论文完成之际,我首先向关心帮助和指导我的指导老师王克刚表示真诚感谢并致以崇高的敬意!

在学校的学习生活快要结束了,回顾四年来的学习经历,面对现在的收获,我感到无限欣慰。为此,我向所有老师和同学表示由衷的感谢!在论文工作中,遇到了许许多多这样那样的问题,有的是专业上的问题,有的是论文格式上的问题,但是王老师的亲切关怀和悉心指导,使我的论文可以又快又好的完成,王老师以其渊博的学识、严谨的治学态度、求实的工作作风和他敏捷的思维给我留下了深刻的印象,我将终生难忘我的王老师对我的亲切关怀和悉心指导,再一次向他表示衷心的感谢,感谢他为学生营造的浓郁学术氛围,以及学习、生活上的无私帮助! 值此论文完成之际,谨向王老师致以最崇高的谢意!最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授!

31

附件

附 件

package com.dsh.mode.dao;

import java.io.File;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Vector;

import javax.swing.table.DefaultTableModel;

import com.dsh.model.FriendModel; import com.dsh.model.LogUnLogModel; import com.dsh.model.LoginModel; import com.dsh.model.MesModel; import com.dsh.model.vo.LoginVO; import com.dsh.model.vo.QQUserVO; import com.dsh.util.DBUtil;

import com.dsh.view.LoginIdSucessFrame; public class Dao {

private DBUtil dbutil=new DBUtil(); /*

* 验证登陆 */

public boolean isEnter(LoginModel lm){ String sql=\

qqnum

from

qquser

qqnum=\

\

32

where

安康学院本科生毕业论文(设计)

} /*

dbutil.setSet(dbutil.executeQuary(sql)); try { }

return false;

if(dbutil.getSet().next()){ }

// TODO Auto-generated catch block e.printStackTrace(); dbutil.closeAll();

return true;

} catch (SQLException e) {

} finally{

* 登陆列表 */

public DefaultTableModel getLoginModel(){ } /*

* 根据sql语句返回表格模型 */

public DefaultTableModel getSqlModel(String sql){

String sql=\l.qqnum QQ号,q.qqname 昵称,t.typename

return this.getSqlModel(sql);

\

\

状态,l.logip IP,l.logtime 登陆时间\

Vector> data=new Vector>(); Vector colName=new Vector(); dbutil.setSet(dbutil.executeQuary(sql)); ResultSetMetaData msd=null; int colCount=0;

33

附件

// 获得数据 try { }

//获得列名: try { } /*

* 关闭通道 */

dbutil.closeAll();

34

msd=dbutil.getSet().getMetaData();

colCount=msd.getColumnCount();//获得列数量

while(dbutil.getSet().next()){ }

// TODO Auto-generated catch block e.printStackTrace();

Vector rowData=new Vector(); for (int i = 1; i <= colCount; i++) { }

data.add(rowData);

rowData.add(

dbutil.getSet().getString(i));

} catch (SQLException e) {

for (int i = 1; i <= colCount; i++) { }

// TODO Auto-generated catch block e.printStackTrace();

colName.add(msd.getColumnName(i));//得到列名

} catch (SQLException e) {

安康学院本科生毕业论文(设计)

} /*

return new DefaultTableModel(data,colName);

* 注册登陆 */

public void addLoginUser(LoginModel lm){ } /*

* 返回指定qq号的好友列表 */

public ArrayList getFriendsList(int qqnum){

String sql=\

dbutil.executeDML(sql);

\lm.getQqip()+\

String sql=\dbutil.setSet(dbutil.executeQuary(sql)); //1- 得到其好友的qq号

ArrayList friends=new ArrayList(); try { }

//2- 获得其好友的FriendModel模型 ArrayList for (Integer frinum : friends) {

35

while(dbutil.getSet().next()){ }

// TODO Auto-generated catch block e.printStackTrace();

friends.add(dbutil.getSet().getInt(1));

} catch (SQLException e) {

friList=new

ArrayList();

附件

}

}

FriendModel friModel=new FriendModel(); QQUserVO user=this.getQQUserByID(frinum); friModel.setQqnum(frinum);

friModel.setQqname(user.getQqname()); friModel.setQqdesc(user.getQqdesc()); friModel.setOlpic(user.getQqolpic()); friModel.setOfpic(user.getQqofpic()); friModel.setMespic(user.getQqmespic());

friModel.setLogtype(10);//先设置好友登陆状态为离线 //检测是否在线,如果在线的设定其登陆状态和登录ip LoginVO login=this.getLoginVOByID(frinum); if(login!=null){ }

friList.add(friModel);

friModel.setIp(login.getLogip()); friModel.setLogtype(login.getTypeid());

// 3- 添加好友自己的信息到列表

FriendModel selfModel=new FriendModel();

QQUserVO selUserVO=this.getQQUserByID(qqnum); LoginVO selLoginVO=this.getLoginVOByID(qqnum); selfModel.setQqnum(qqnum);

selfModel.setQqname(selUserVO.getQqname()); selfModel.setQqdesc(selUserVO.getQqdesc()); selfModel.setOlpic(selUserVO.getQqolpic()); selfModel.setOfpic(selUserVO.getQqofpic()); selfModel.setMespic(selUserVO.getQqmespic()); selfModel.setIp(selLoginVO.getLogip()); selfModel.setLogtype(selLoginVO.getTypeid()); friList.add(0,selfModel); return friList;

36

安康学院本科生毕业论文(设计)

/*

* 删除登出的用户 */

public void unLoginUser(int qqnum){ } /*

* 查询指定qq号的在线好友的LogUnLogModel */

public ArrayList getOnLineFriendModel(int qqnum,int logType){ } /*

* 得到所有在线好友LoginVO */

public ArrayList getOnLineFriendQQList(int qqnum){

String sql=\dbutil.executeDML(sql);

ArrayList ArrayList for (LoginVO fri : onFris) { }

return list;

LogUnLogModel clog=new LogUnLogModel(); clog.setChangeQqnum(qqnum); clog.setLogType(logType); clog.setFriIP(fri.getLogip()); list.add(clog);

list=new

ArrayList();

onFris=this.getOnLineFriendQQList(qqnum);

String sql=\dbutil.setSet(dbutil.executeQuary(sql)); //1- 得到其好友的qq号

37

附件

}

ArrayList friends=new ArrayList(); try { }

//2- 得到在线好友的qq号 ArrayList for (Integer frinum : friends) { }

return onLinefriends;

LoginVO login=this.getLoginVOByID(frinum); if(login!=null){ }

onLinefriends.add(login);

onLinefriends=new

while(dbutil.getSet().next()){ }

// TODO Auto-generated catch block e.printStackTrace(); dbutil.closeAll();

friends.add(dbutil.getSet().getInt(1));

} catch (SQLException e) {

} finally{

ArrayList();

//--------------- 获取VO ----------------------------------- /*

* 返回指定qq号的 qquserVO */

public QQUserVO getQQUserByID(int qqnum){

String sql=

\

\\

QQUserVO vo=null;

dbutil.setSet(dbutil.executeQuary(sql));

38

安康学院本科生毕业论文(设计)

try { if(dbutil.getSet().next()){ vo=new QQUserVO(); vo.setQqnum(qqnum);

vo.setQqname(dbutil.getSet().getString(1)); vo.setQqpass(dbutil.getSet().getString(2)); vo.setQqdesc(dbutil.getSet().getString(3)); vo.setQqsex(dbutil.getSet().getInt(4)); vo.setQqbirthday(dbutil.getSet().getDate(5)); vo.setQqolpic(dbutil.getSet().getBytes(6)); vo.setQqofpic(dbutil.getSet().getBytes(7)); vo.setQqmespic(dbutil.getSet().getBytes(8));

}

} catch (SQLException e) {

// TODO Auto-generated catch block e.printStackTrace(); } finally{

dbutil.closeAll();

}

return vo;

} /*

* 根据qq号,得到LoginVO对象 */

public LoginVO getLoginVOByID(int qqnum){ String sql=\typeid,logip,logtime from login qqnum=\

dbutil.setSet(dbutil.executeQuary(sql)); LoginVO vo=null;

try {

39

where

本文来源:https://www.bwwdw.com/article/nvdh.html

Top