Java即时聊天系统的设计与实现

tuyi456com 贡献于2014-04-14

作者 周  创建于2013-06-01 07:57:00   修改者周  修改于2013-10-20 13:57:06字数23021

文档摘要:C/S架构的即时聊天系统的设计与实现摘要:随着信息时代的飞速发展,尤其是互联网技术的兴起,使人们愈来愈倾向于通过网络来交流、传递消息。网络即时聊天系统正是这样一个被广泛应用的媒介。借助它,人们可以方便地进行实时对话,文件传送等。本文以一个“即时通讯系统”的设计和开发为背景,详细介绍了以Java语言和MySql数据库为平台开发软件系统的过程。系统的实现是基于TCP/IP通信协议,使用的是客户端/服务器模式,用到了Java里面的Swing、多线程、JDBC、Socket等高级编程技术。通过直接使用Java提供的ServerSocket和ObjectInputStream等类将客户端和服务器端发送的各类消息封装成统一的数据流以实现消息的交换。本系统的开发过程遵循了基本的软件工程学的方法,实现了即时通讯、群组聊天、文件传送等功能。
关键词:

 C/S架构的即时聊天系统的设计与实现 摘要:随着信息时代的飞速发展,尤其是互联网技术的兴起,使人们愈来愈倾向于通过网络来交流、传递消息。网络即时聊天系统正是这样一个被广泛应用的媒介。借助它,人们可以方便地进行实时对话,文件传送等。本文以一个“即时通讯系统”的设计和开发为背景,详细介绍了以Java语言和MySql数据库为平台开发软件系统的过程。系统的实现是基于TCP/IP通信协议,使用的是客户端/服务器模式,用到了Java里面的Swing、多线程、JDBC、Socket等高级编程技术。通过直接使用Java提供的ServerSocket和ObjectInputStream等类将客户端和服务器端发送的各类消息封装成统一的数据流以实现消息的交换。本系统的开发过程遵循了基本的软件工程学的方法,实现了即时通讯、群组聊天、文件传送等功能。 关键词:Java;数据库;Socket编程;即时通讯系统;TCP/IP协议 The Instant Messaging System based on C/S Structure Abstract: With the rapid development of the information age, especially the rise of internet technology, more and more people tend to communicate and deliver the messages through the internet.Instant messaging system is such a widely used medium. With it,the real-time dialogue and file transfer can be easily carried out. Taking the design and development of the instant messaging system as the background , this article describes in detail the process of developing software systems with Java and MySql. The realization of the system is based on the TCP / IP communication protocol, and uses a client / server mode .Many advanced java technologies such as Swing ,java multi-threading, JDBC, socket programming and so on are used. By directly using the ServerSocket ,ObjectInputStream and other classes supported in Java API, messages sented by the client and server side are packaged into a uified data stream in order to achieve the exchange of messages. The whole development process of this system follows software engineering methods,and instant messaging, group chatting, file transferring and other functions are realized. Keywords: Java; database; Socket programming; instant messaging system; TCP/IP protocol 目 录 第一章 引言 1 1.1选题背景和意义 1 1.2本文的主要工作 2 第二章 基于C/S架构的即时通讯系统概述 3 2.1系统的可行性分析 3 2.2系统的实现目标和基本功能 4 2.3系统开发环境和关键技术介绍 4 第三章 基于C/S架构的即时通讯系统设计 9 3.1系统详细设计 9 3.1.1 系统总体流程图 9 3.1.2 系统总体功能模块划分 10 3.1.3 系统用例图 11 3.1.4 系统数据流图 13 3.2 数据库设计 14 3.3 系统关键类结构设计 19 第四章 基于C/S架构的即时通讯系功能实现 24 4.1注册模块功能实现 24 4.2登录模块功能实现 26 4.3聊天模块功能实现 28 4.4文件传送模块功能实现 32 4.5后台管理模块功能实现 36 第五章 总结 40 致谢 43 参考文献 44 本科毕业设计 第一章 引言 1.1选题背景和意义 随着经济全球化的发展,世界各地的不同人、组织、机构之间的联系越来越密切。同时伴随着互联网技术的普及和发展,网络即时通信工具已经作为一种廉价、方便的信息交流工具越来越受到人们的青睐。在21世纪初的短短十几年间,即时通信系统(IM)的发展不断地取得了惊人的成就。从早期只能互相发送字符并显示在双方的屏幕上的实时通信程序到现在的图形化、面向互联网、多功能的即时通信系统,科学技术的进步和整合不断地促使着即时通信系统功能越来越丰富,用处越来越广泛。从最早的即时通讯软件ICQ诞生至今,市场上不断涌现出类似的产品。不少厂商分别推出了自己的IM,如腾讯QQ、阿里旺旺、新浪UC、移动飞信等,这些都是我们所熟悉的PC端的即时通讯软件。随着智能手机、平板电脑的普及,一些移动端的即时通信系统也如雨后春笋般涌现出来,如小米公司的米聊,腾讯公司的微信,还有年轻人之间很流行的陌陌、游戏玩家常用的YY语音等。这些软件本身功能也越来越丰富,远远超出了单纯的即时聊天系统的范畴。现在的即时通信系统不仅仅是人们的沟通工具,还成为了人们利用其进行电子商务、工作、学习等交流的平台[15][16]。 在当今社会,不管是个人用户还是企业用户,对沟通的需求总是在不断地发展。传统的沟通交流方式如电话、传真、邮件等已经不能完全满足人们学习、工作、生活的需要。随着计算机软件、计算机网络和移动通信技术的发展融合,集方便、廉价、快捷、实时等优点于一身的即时通讯系统可以说是继电子邮件、万维网之后,互联网上最具有杀伤力的应用。很难想象一台个人电脑没有安装像QQ这样的即时通讯软件。虽然即时聊天系统设计的初衷是聊天,但正如前面所说,其功能已经超出了聊天的范畴,随着企业即时通讯工具(EIM)的出现,IM系统更是成了企业信息发布、资源共享、问题探讨和网络营销的一把利器。通过现有的技术,企业完全可以摒弃通用的免费的即时通讯系统,转而根据自己企业的需求 本科毕业设计 定制开发自己专属的内部即时通讯系统,以实现更好的管理,提高员工的工作效率。我们的生活中沟通无处不在,即时聊天系统这类广泛使用的基础软件的研究开发意义深远[15]。 1.2本文的主要工作 本文围绕一个简单实用的即时聊天系统的开发,详细介绍了使用Java编程语言、Java API和MySQL数据库构建一个软件系统的过程。整个系统的分析、设计、开发、测试等过程遵循了软件工程学的方法。论文分为如下几个部分: 第一部分,阐述了对即时聊天系统的分析。包括系统的可行性分析、系统实现的目标和基本功能分析以及使用的一些关键技术分析。 第二部分,阐述了整个系统的设计过程。包括系统总体设计、功能模块划分、数据库设计和关键类的设计。 第三部分,详细介绍了整个系统的实现。针对每一个功能的具体实现展开介绍,包括使用到的开发技术、类库,第三方jar包等等。 第四部分,总结与展望。针对系统的优点和不足对系统进行了总结与展望。 本科毕业设计 第二章 基于C/S架构的即时通讯系统概述 2.1系统的可行性分析 进行可行性研究就是在行动以前,对要办的事进行调查,确认其可行与不可行,即:可行则行,不可行则止。可行性研究的目的不是解决问题,而是研究在当前的具体条件下,开发新系统是否具备必要的资源和其它条件。为了达到这个目的,必须认真了解用户的要求及现实环境,探索若干种可供选择的解绝方案,并对每种解决方案的可行性进行仔细论证。一般来说应从以下几个方面进行论证[12]:      ·  技术可行性:使用现有的技术能是否实现这个系统      ·  经济可行性:这个系统的经济效益是否超过它的开发成本      ·  操作可行性:系统的操作方式在这个用户组织内是否行得通  在对本系统的分析中,同样是从上面三个方面入手。本系统的可行性分析包括以下几个方面的内容: (1)技术可行性:基于网络通信原理,利用Java提供的Swing、Socket等API和多线程编程、JDBC等技术可以开发出简单实用美观的即时聊天系统,因此技术上是可行的。 (2)经济可行性:个人电脑和网络的普及使得我们不需要太多的经济投入。在软件方面,可以采用免费的IDE如Eclipse和轻量级数据库MySQL。无需太多的经济投入即可为局域网内的即时通讯系统的实现提供支持。 (3)操作可行性:一方面可以让本地机同时作为客户端和服务器实现一台机器上的即时通讯。另一方面,只要一台以上计算机连接在同一个局域网内,并且在作为客户端机器的本系统中设置需要连接的作为服务器端机器的IP地址,本系统就可以实现局域网通讯,所以操作上完全不存在问题。如果要实现internet上通讯,理论上只需要将服务器端运行在一个有固定IP的公网上就可以。 综上所述,这种C/S架构的即时通讯系统的开发是可行的。 本科毕业设计 2.2系统的实现目标和基本功能 对于个人用户而言,能够实现好友即时通讯,传递实时信息,让用户随时随地都可与好友保持畅快有效的沟通。 对于企业用户而言,能够实现建立员工交流平台,统一信息发布平台,减少运营成本,促进企业办公效率。 商业即时通讯系统的功能越来越多样化,一些功能也很新颖,如现在流行的语音对讲功能。本系统不比商业系统,没有考虑过多的复杂性,主要实现了基本的通讯功能,以满足学习研究之用。其基本功能有用户注册、客户端登录、一对一实时聊天、群组聊天、传送文件、服务器后台管理。 2.3系统开发环境和关键技术介绍 (1)Java语言简介 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景[1][8]。 Java之所以被开发,是要达到以下五个目的[2]: · 应当使用面向对象程序设计方法学 · 应当允许同一程序在不同的计算机平台执行 · 应当包括内建的对计算机网络的支持 · 应当被设计成安全地执行远端代码 · 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。 本科毕业设计 Java语言有着简单、面向对象、分布式、健壮、安全、可移植等特性,因此受到了众多程序开发人员的青睐。 (2)Eclipse简介 Eclipse是著名的跨平台开源集成开发环境(IDE)。它是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。人们最初主要用它来做Java语言开发,目前亦有人通过插件使其作为C++、Python、PHP等其他语言的开发工具。Eclipse本身就是用Java语言开发的,它的设计思想是:一切皆是插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本内核包括:图形API (SWT/Jface), Java开发环境插件(JDT ),插件开发环境(PDE)等。这些特性使得Eclipse拥有较佳的灵活性,许多软件开发商以Eclipse为框架开发自己的IDE[13]。 (3)MySql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。MySQL软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。本系统采用的后台数据库即为社区版[7]。 (4)网络通信协议简介 网络通信协议为连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言。网络通信的层次结构和网络通信的协议,是开发网络程序的基础。目前在网络编程方面最常用的是TCP/IP和UDP通信协议。通过这些协议,网络通信的各主机可以用一种统一而非杂乱的规范,高效便捷地相互发送和接收消息。 本科毕业设计 本系统在通讯功能实现中采用了TCP传输协议,直接使用的Java API提供的类Socket和Serversocket等来实现[6][9]。 ▪TCP传输协议说明 TCP协议是面向连接的协议,比如说在客户端A和B进行连接之前必须首先建立数据通路,就向打电话一样,在通话之前必须先拨号,等待对方的接听以后才能进行通话。TCP协议中数据传输采取的是同步方式,当数据发送到对方时,必须等待接收方的应答信号后才能继续下一次的发送工作,即通常所讲的三次握手。由于TCP协议采用的是这种连接方式,因此由它建立的连接是可靠的。在网络不是十分理想的情况下,速度牺牲很大,但是却能够保证所传输的数据的正确性。 ▪ UDP传输协议说明 UDP协议采用的是面向无连接的通信方式,它在通信前不需要提前建立通信链路,它是异步的,数据的发送比较迅速,不需要等待应答信号。优点是发送速度较快,但是在数据的一致性方面不好,在网络差的情况下,容易丢失数据包。另外,使用UDP传输数据时对数据是有大小限制的,每个被传输的包必须限定在64KB之内[6]。 ▪Java Socket(套接字)说明 在Java语言里,使用Socket(套接字)模型来封装网络传输的具体动作。Java提供了Socket的相关包,Java中Socket的设计采用了面向对象的思路,模拟了TCP协议里客户端和服务器端的通信流程,并封装了创建连接、发送接收数据流、断开连接等方法。所以,使用Socket包,程序员不仅可以创建客户端和服务器之间的通信信道,还能实现发送和接收数据流等的网络通信功能。 针对一个特定的连接和通信过程,服务器和客户端程序里都有一个Socket对象,我们可以想象一下其场景,在通信过程中,有一条虚拟的“光缆”构架在服务器和客户端之间,光缆的两头都插在了Socket这“插座”里。事实上,Java采用Socket包是对TCP协议的进一步抽象,更向程序员屏蔽了TCP通信的细节,具体表现在以下两方面 [9]。 本科毕业设计 ▪ 在使用Socket类里的方法建立信道的时候,Socket类屏蔽了通过三次握手建立信道的全部流程,直接向程序员返回信道类的句柄(Socket类的实例)或是出错信息。 ▪ Socket类向程序员屏蔽了服务器和客户端之间的物理硬件指标和底层的连接方式,所以我们在使用Socket类开发网络程序时,可以简单地调用其提供的方法来传输数据,而不必关心数据流的传输和接收方式[6]。 Java中的Socket通信流程如图2-1所示。 构造Server端数据输入流对象 构造Server端数据输出流对象 在数据流中发送、接收客户消息 建立客户端Socket连接 Socket client =new Socket(“ServerHost”,8888); 构造Client端数据输入流对象 构造Client端数据输出流对象 在数据流中发送、接收客户消息 建立服务器端套接字 对象监视端口 ServerSocket server =new ServerSocket(8888); 关闭Server端的 输入流 输出流 Socket连接 关闭Client端的 输入流 输出流 Socket连接 接收连接 返回新Socket对象 Socket socket=server.accept(); 主动连接 新建一个Socket连接 监听 图 2-1 Socket客户-服务器的通信流程图 本科毕业设计 第三章 基于C/S架构的即时通讯系统设计 3.1系统详细设计 3.1.1 系统总体流程图 在系统开发之前,先对系统进行了整体设计,系统流程图如图3-1。 开始 启动服务器 否 判断启动信息 是 启动客户端 否 注册用户 判断登录信息 是 登录成功 即时聊天 退出客户端 关闭服务器 结束 本科毕业设计 图3-1系统总体流程图 3.1.2 系统总体功能模块划分 本系统主要分为注册、登录、聊天、文件传送、后台管理五大模块。整个系统的详细结构如图3-2所示。 图 3-2 系统总体功能模块划分 注册 模块 基于C/S架构的即时聊天系统 文件 模块 登录 模块 聊天 模块 后台管理 模块 发送 文字 发送 表情 发送 文件 接收 文件 服务管理 用户管理 消息管理 群组聊天 各个功能模块设计如下: 1、注册模块 在登录界面上有注册按钮,用户可以点击注册,填入个人相关资料,提交给服务器。服务器接收到信息后通过纯JDBC方式或者JDBC—ODBC桥接的方式连接数据库并添加记录。 2、登录模块 用户在客户端输入账号和密码,然后建立与服务器端的连接,告诉服务器执行登录操作。服务器收到后,开始通过JDBC读取数据库,然后与用户输入的信息进行比对,如果成功,便打开主程序窗口。然后客户端向服务器请求读取好友列表,服务器收到该请求后从数据库中取出该用户的好友列表,然后向客户端发送这些信息,客户收到后就在主窗口显示好友。 本科毕业设计 3、实时聊天模块 客户端首先发送消息到服务器端,服务器端程序判断客户端发来的信息类型,如果是普通的聊天消息就根据发送者信息和接受者信息进行消息转发。例如客户端A向客户端B发送消息的处理过程如下:首先A向服务器发送消息,服务器程序判断消息类型,如果是普通的聊天消息,则解析该消息,得到该消息的发送者A,接受者B。接着判断B是否在线,如果在线就将消息发送过去,否则将消息存入数据库。B接收到A发来的信息,如果是未建立对话窗口,则在屏幕右下角出现弹窗提示。 此外还有群组聊天功能,可以在“官方聊天室”功能中实现一对多的聊天,即在聊天室发送的消息是面向所有在线用户的。 4、传送文件模块 在聊天主界面上有文件传送功能,可以选择任意的本地文件进行双向传送。不管是何种格式的文件,在底层全部通过ObjectOutputSteam/ObjectInputSteam等Java提供的不同形式的流处理对象转化为二进制的字节流传送。在接收端再从这些I/O流中读取还原原始数据。 5、系统后台管理模块 (1)服务管理:服务器端的管理员可以在这里启动后台的服务器,发布聊天室公告或者弹窗公告给所有在线用户。如果未开启服务器,则在客户端无法登录,并会返回相应的消息提示。 (2)用户管理:可以根据用户名或者用户ID查询已注册的用户详细信息,并且可以修改、保存相关信息。这是一个对数据库的简单的增删改查的操作。 (3)消息管理:当一个用户给其不在线的用户发送消息时,系统会理解为发送的是离线消息。此消息将会存入数据库,等目标用户上线后再将消息推送过去。 本科毕业设计 3.1.3 系统用例图 用例( Use Case)是软件工程或系统工程中对系统如何反应外界请求的描述,是一种通过用户的使用场景来获取需求的技术。用例图是由主角、用例以及它们之间的关系构成的图,该图说明了用例模型中的关系[12]。本系统的用例图如图3-3、3-4所示。 ▪普通用户用例图: 用户 注册 文字 登录 聊天 文件 接收文件 发送文件 表情 <> <> <> <> 图 3-3普通用户用例图 ▪后台管理员用例图: 本科毕业设计 服务器管理员 查找用户 查看在线用户 删除用户 查看聊天记录 关闭服务器 图 3-4后台管理员用例图 启动服务器 3.1.4 系统数据流图 数据流图(DFD),是从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程。是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法 [12]。本系统的数据流图如图3-5至图3-7所示。 (1)顶层数据流图 聊天用户 聊天用户 局域网即时聊天系统 图3-5顶层数据流图 (2)客户端数据流图 本科毕业设计 登录界面 好友列表界面 好友聊天界面 查看用户信息 聊天室界面 连接到服务器线程 Socket连接 图 3-6 客户端数据流图 Socket连接 服务器端控制台 数据库操作 验证用户密码 连接到客户端线程 图 3-7 服务器端数据流图 (3)服务器端数据流图 本科毕业设计 3.2 数据库设计 1、数据库需求分析 根据即时聊天系统的功能模块分析可知,一个最最简单的聊天系统至少应该包括一张用户基本档案的数据表。由于本系统功能设计理念较为简单,因此只包含了两张数据表:用户表(users)和消息表(msg)。用户表用于存储用户信息,消息表用于存储用户的离线聊天消息,因此本系统需要的数据源包括用户信息、离线聊天消息。 2、概要设计 根据数据库的需求分析设计规划出的数据实体有:账户实体、用户信息实体、离线消息实体。每一个实体都是现实中实际存在的对象的抽象,并存在一定的数据关系。图3-8至3-10给出本系统的总体E-R图和数据库中各信息实体的E-R图[4][5]。 系统总体E-R模型: 本科毕业设计 图3-8系统总体E-R图 账 户 账户名 账户密码 账户ID 拥 有 用户信息 上次登录日期 用户性别 用户状态 用户IP 上次退出日期 用户头像 用户生日 用户邮箱 拥 有 离线消息 消息ID 消息发送时间 消息类型 消息发送者 消息内容 消息接受者 1 1 1 N 用户的基本信息E-R模型:用户(用户ID,用户名,用户密码,用户IP地址,用户状态, 本科毕业设计 用户性别,用户邮箱,用户最近一次登录日期,用户上一次退出日期,用户签名,用户头像,用户生日) 用户信息 用户ID 上次登录日期 用户性别 用户状态 用户IP 用户密码 用户名 上次退出日期 用户头像 用户生日 用户邮箱 图 3-9用户信息E-R图 离线消息的E-R模型:消息(消息ID,消息内容,消息发送者,消息接收者,消息发送时间) 消息信息 图 3-10聊天消息E-R图 消息ID 消息发送时间 消息类型 消息发送者 消息内容 消息接受者 3、逻辑设计 本科毕业设计 本系统的数据库名称是MyIM,该数据库中包含了两张表,分别为用户信息表、聊天消息表。下面简要介绍这两个表的设计。 (1)用户信息表: 该表中记录了本系统所有注册用户的用户名及其密码,以及其它一些个人信息。用户可以在客户端登录窗口通过输入用户名和匹配的密码登录,用户信息中只要有两者之一与该表内容不符便无法登录,系统会给出出错提示。 该表的设计如下: 表1 用户信息表 字段名 数据类型 是否是主键 U_ID int 是 U_NAME varchar(50) 否 U_PWD varchar(50) 否 U_IP varchar(50) 否 U_STATE varchar(10) 否 U_GENDER varchar(50) 否 U_EMAIL varchar(50) 否 U_LAST_LOGIN date 否 U_LAST_EXIT date 否 U_HEAD_IMG varchar(50) 否 U_BIRTHDAY date 否 (2)离线消息表:记录了用户发送给离线好友的消息,管理员可以查看。包括发送者、接受者和消息产生的时间等。 表2 聊天消息表 字段名 数据类型 是否是主键 MSG_ID int 是 MSG_CONTENT varchar(2000) 否 MSG_SENDFROM int 否 MSG_SENDTO int 否 本科毕业设计 MSG_TYPE varchar(2) 否 MSG_SENDTIME date 否 4、物理设计 数据库最终要存储于存储设备上,将一个给定逻辑结构实施到具体的环境中时,逻辑数据模型要选取一个具体的工作环境,这个工作环境提供了数据存储结构与存取方法。图3-11、图3-12是在MySQL中本系统数据库的物理结构的具体实现[4]。 (1) users.dbf表 图 3-11 users表 /*创建msg.dbf表格*/ CREATE TABLE `users` ( `U_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `U_NAME` varchar(50) NOT NULL COMMENT '用户名', `U_PWD` varchar(50) NOT NULL COMMENT '密码', `U_IP` varchar(50) DEFAULT NULL COMMENT 'IP地址', `U_STATE` varchar(50) DEFAULT NULL COMMENT '用户状态', `U_GENDER` varchar(50) DEFAULT NULL COMMENT '性别', `U_EMAIL` varchar(50) DEFAULT NULL COMMENT '电子邮件', `U_LAST_LOGIN` date DEFAULT NULL COMMENT '最后一次登录', `U_LAST_EXIT` date DEFAULT NULL COMMENT '最后一次退出', `U_SIGNATURE` varchar(100) DEFAULT NULL COMMENT '个性签名', `U_HEAD_IMG` varchar(100) DEFAULT NULL COMMENT '头像', `U_TYPE` varchar(50) DEFAULT NULL COMMENT '类型', `U_BIRTHDAY` date DEFAULT NULL COMMENT '生日', PRIMARY KEY (`U_ID`) 本科毕业设计 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; (2) msg.dbf表 图 3-12 msg表 /*创建msg.dbf表格*/ CREATE TABLE `msg` ( `MSG_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '消息ID', `MSG_CONTENT` varchar(2000) NOT NULL COMMENT '消息内容', `MSG_SENDFROM` int(11) NOT NULL COMMENT '消息发送者', `MSG_SENDTO` int(11) DEFAULT NULL COMMENT '消息接收者', `MSG_SENDTIME` date NOT NULL COMMENT '消息发送时间', `MSG_REMARK` varchar(3000) DEFAULT NULL COMMENT '备用', `MSG_TYPE` varchar(2) DEFAULT NULL COMMENT '消息类型,如是群聊消息还是私聊消息', PRIMARY KEY (`MSG_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 3.3 系统关键类结构设计 本系统采用简单的MVC设计模式,具体架构如图3-13所示。 图3-13 程序架构 所谓MVC模式,即模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计规范,是一种使业务逻辑和数据显示分离的代码组织方法。它强制性地使应用程序的输入、处理和输出分开。MVC模式里包含三个核心部件:模型、视图、控制器。它们各自处理自己的任务。采用MVC模式组织系统有如下好处 本科毕业设计 [3]: (1)耦合性低 视图层和业务层分离,这样就允许更改视图层代码,而不用重新编译模型和控制器代码。运用了MVC的应用程序三个部件相互独立,改变其中一个不会影响其他两个。例如在本系统中,笔者采用的是MySQL数据库,如果把数据库从MySQL移植到oracle,只需改变模型即可,因为模型和控制器、视图向分离,所以很容易改变应用程序的数据层和业务规则。 (2)重用性高 MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图可以共享一个模型。例如在本系统中存在存在两个不同的聊天窗口:一对一聊天、聊天室聊天,其实不管是哪种方式的聊天在后台控制层都可以采用同一个控制器,不需要因为界面的不同而大动后台的控制代码,充分利用这一点以提高代码重用性。 (3)可维护性高 MVC模式层次分明,结构清晰,分离视图层和业务逻辑层使得应用程序更容易维护和修改。 (4)有利于软件工程化管理 由于不同的层各司其职每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化的方式管理程序代码。 在本系统中,很明显的可以看出,模型层即为model包,视图层即为view包,控制层即为tools包和db包,包的名称取法因人而异,其本质都是反映了MVC的思想。 本科毕业设计 关键Java类设计 (1)Msg类 客户端和服务器端通信时,不管是纯粹的聊天内容,还是一个返回好友列表的请求,亦或是客户端登录验证的消息,其实发送的都是Msg类的对象。Msg类封装了消息类型、发送双方、发送时间等属性,它是本系统中双方通信的载体。 表3 Msg类 属性名 作用 private int msgId 消息的ID号,唯一识别该消息 private String msgContent 消息的内容 private int sendFrom 消息的发送者 private int sendTo 消息的接收者 private String sendTime 消息发送时间 private String msgTye 消息类型(私聊、群消息) (2)Users类 用户表的实体即转化成Java程序中的Users类,该类封装了用户的各项信息,是实现不同用户相互聊天的基本对象,也是建立通讯连接的主体。 表4 Users类 属性名 作用 private int id 用户ID,唯一识别该用户 private String name 用户名 private String pwd 用户密码 private String ip 用户登录机器IP private String state 用户在线状态 private String gender 用户性别 本科毕业设计 private String email 用户电子邮箱 private String lastLogin 用户上一次登录时间 private String lastExit 用户上一次退出系统时间 private String headImg 用户头像 (3) MyServer和MyClient类 本系统设计的目的便是即时聊天,MyServer类和MyClient类便是实现通信功能的主干类,它是一个功能类,不是一个实体类,因此没有封装太多的属性。此类的主要代码如下: MyServer类: public class MyServer { public MyServer() { try { System.out.println("服务器在8888端口监听"); ServerSocket ss = new ServerSocket(9988); while (true) { Socket s = ss.accept(); ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); User u=(User)ois.readObject(); System.out.println("服务器接收到用户id:"+u.getUserId()+"密码:"+u.getPasswd()); Message m=new Message(); ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); if (u.getPasswd().equals("123456")) { // 返回成功登录的消息 m.setMesType("1"); oos.writeObject(m); //这里就单开一个线程,让该线程与该客户端保持通讯 SerConClientThread scct=new SerConClientThread(s); //加入服务器端的HashMap便于统一管理 ManageClientThread.addClientThread(u.getUserId(), scct); Thread t=new Thread(scct); t.start(); //通知在线的其他人我上线了 scct.notifyOther(u.getUserId()); } else { m.setMesType("2"); 本科毕业设计 oos.writeObject(m); s.close(); } } } catch (Exception e) { e.printStackTrace(); } } } MyClient类: public class ClientConServer { public Socket s; // 客户端请求(参数声明成Object类型,客户端只有第一次请求发送的是user对象) public boolean sendLoginInfoToServer(Object o) { boolean b = false; try { System.out.println("正在向服务器发送请求......"); s = new Socket("127.0.0.1", 9988); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); oos.writeObject(o); //读取从服务器发来的信息,成功返回前一直阻塞 ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); // 根据服务器返回的Message的类型判断是否成功登录 Message ms = (Message) ois.readObject(); if (ms.getMesType().equals("1")) { ClientConServerThread ccst=new ClientConServerThread(s); //启动该通讯线程 ccst.start(); ManageClientConServerThread.addClientConServerThread(((User)o).getUserId(), ccst); b = true; } else { s.close(); } } catch (Exception e) { e.printStackTrace(); } finally { } return b; } 本科毕业设计 第四章 基于C/S架构的即时通讯系功能实现 4.1注册模块功能实现 [注册]模块分析 正如我们使用的QQ一样,使用之前我们要申请一个QQ号。本系统虽然没有设计这么复杂的流程,但是也必须在登录前注册账号。只有后台数据库里存在的用户才能使用本系统。注册界面如图4-1所示,填完消息点击注册即可。这个界面运用了EmptyBorder、JComboBox等Java组件,将各个组件完美的组合在一个JPanel上,设置JFrame对象的背景图片,即可构造出美观的界面。为了使系统的界面更加美观且易于构建,本系统使用了两个第三方包:AbsoluteLayout.jar,swing-layout-1.0.3.jar。 图 4-1注册界面 本科毕业设计 此外,信息填写不完整或填写有误将有错误提示,如图4-2。此处调用了JOptionPane对象的showMessageDialog方法,通过设置该方法的参数显示不同类型的提示框。邮箱地址的检测用到了Java里面的正则表达式相关知识,使用Pattern对象对邮箱地址格式的正则式进行编译,再调用Matcher对象的matches方法判断用户输入的邮箱是否与该格式匹配。 图4-2错误提示界面 注册完成后,通过JDBC技术连接MySQL数据库将记录插入数据库表中。 注册功能关键代码如下: public void addEvent() { btnRegister.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (txtName.getText().equals("")) JOptionPane.showMessageDialog(null, "用户名不能为空!", "错误", JOptionPane.ERROR_MESSAGE); else if (new String(pwd.getPassword()).equals("")) JOptionPane.showMessageDialog(null, "密码不能为空!", "错误", JOptionPane.ERROR_MESSAGE); else if(!newString(pwd.getPassword()) .equals(new String(pwdRe.getPassword()))) JOptionPane.showMessageDialog(null, "两次输入的密码不一致,请重新输", "错误", JOptionPane.ERROR_MESSAGE); else { 本科毕业设计 try { if (cs_TCP == null) cs_TCP=new CS_TCP(MyTools.QQServerIP,MyTools.QQServerPort); String sex = "男"; if (comGender.getSelectedIndex() == 1)sex = "女"; cs_TCP.sendMessage(Flag.REGISTER + MyTools.FLAGEND// 注册标志 + txtName.getText() + MyTools.SPLIT1// 用户名 + new String(pwd.getPassword()) + MyTools.SPLIT1// 密码 + sex + MyTools.SPLIT1// 性别 + txtEmail.getText() + MyTools.SPLIT1// 电子邮件 + txtbirthday.getText() + MyTools.SPLIT1// 生日 + txtSignat.getText() + MyTools.SPLIT1// 个性签名 + comboBoxHeadImage.getSelectedIndex());// 头像索引 } catch (Exception ee) { ee.printStackTrace(); JOptionPane.showMessageDialog(null, "连接服务器失败!请检查您的网络连接或确保服务器 已启动!", "错误", JOptionPane.ERROR_MESSAGE); } } }); } 4.2登录模块功能实现 [登录]模块分析 登录模块用于验证客户端用户的合法性,用户输入用户名和密码后通过Msg对象将其封装成客户端消息,通过ObjectInputStream对象写入socket流中传给服务器,服务器收到客户端传来的Msg对象后解析出用户名和密码并和数据库的记录比对,两者完全正确方可成功登录。在登录界面(如图4-3)验证通过则会进入客户端好友列表界面(如图4-4),否则弹出一个MessageDialog提示用户名或密码错误。此界面右上角的关闭和最小化按钮全部是用的ImageIcon对象,所以外观不同于Windows系统自带的效果。当鼠标移至这两个按钮后会调用setIcon方法,改变此按钮的图标,从而显示出按钮颜色深浅变化的效果。 本科毕业设计 图 4-3登录界面 图4-4好友列表 本科毕业设计 登录验证关键代码如下: public void login() { String name = textField用户名.getText(); String password = new String(pwd密码.getPassword()); if (name.equals("") || password.equals("")) JOptionPane.showMessageDialog(this, "用户名和密码不能为空!", "错误", JOptionPane.ERROR_MESSAGE); else { try { if (cs_TCP == null) cs_TCP = new CS_TCP(MyTools.QQServerIP, MyTools.QQServerPort, this, main); System.out.println("开始检测用户名和密码……"); cs_TCP.sendMessage(Flag.LOGIN + MyTools.FLAGEND + name + MyTools.SPLIT1 + password + MyTools.SPLIT1 + main.getServerPort() + MyTools.SPLIT1 + comboBox状态.getSelectedIndex()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "连接服务器失败!请检查网络连接或确保服务器已启动!"); } } } 4.3聊天模块功能实现 1、[一对一聊天]模块分析 聊天模块是本系统的主要功能模块,本系统开发的目的就是实现即时聊天。在好友列表中单击鼠标选中一位好友后再右击鼠标,出现功能选项(如图4-5),点击“发送即时消息”,即可打开一对一聊天界面(如图4-7)。在界面下方的消息输入框内输入消息内容,点击发送按钮,即将消息发送给对方。点击表情按钮,还可以发送类似QQ表情的消息给对方。当对方收到消息后如果没有打开相应的聊天窗口将会在屏幕右下角出现弹窗提示(如图4-6),点击打开按钮即可打开聊天窗口,相互发送消息。 本科毕业设计 图4-5 好友列表 这个界面使用的纯Swing技术开发,运用了卡片布局(CardLayOut)、网格布局(GridLayOut)、盒布局(BoxLayout)等多种布局管理器相结合的方法。使用了JSlider和JList等控件,通过调用JList的setCellRenderer方法即可改变列表项的外观,制作出较为复杂的组件,比如加入了头像显示功能。右键菜单是使用JPopupMenu对象来实现的。可以看出控件的显示风格不同于Windows默认风格,这是因为引入了第三方的界面库,程序里调用UIManager.setLookAndFeel方法可以改变图形界面的外观风格[1][14]。 本科毕业设计 消息弹窗界面使用了JTextArea组件,并沿用了登录窗口的背景图片。弹窗效果的实现主要是靠3个定时器Timer对象: 1、 平滑移动的定时器,使得窗口从右下角缓慢移动到适当的位置。 2、 窗口停留定时器,移动到合适位置后,开始计时,15秒后窗口自动消失,也可以自行点击关闭。 3、 窗口关闭定时器,关闭时采用透明渐变的方式,完全透明时自动退出。 图4-7的聊天界面中运用了两个JTextPane对象,一个用作发送消息,一个接收。在JTextPane中加入了TestJProgressBar对象,使其成为带有滚动条的文字显示区域。上方的工具条和右侧的仿QQ秀用的是JLabel对象,在JLabel中调用setIcon方法添加不同的背景图片。由于要使得点击传送文件的图标就能够触发该功能,所以给此JLabel对象加入监听事件,使其成为一个事件源。 2、[聊天室聊天]模块分析 正如QQ的群功能一样,本系统也模拟了一个群聊天的功能。点击好友列表界面的群组选项卡里的“进入官方聊天室”按钮,在这里可以实现消息的广播发送。进入官方聊天室后,用户发送的消息将被推送至所有在线用户。这里设置了多个Thread线程对象,完成给多个不同的用户发送消息。官方聊天室界面(如图4-8、4-9)的FriendList里可以看到当前所有在线用户,右上方有个群公告栏,可以在用户管理里发布群公告。群公告面板实质是一个不可编辑的JTextArea,通过调用JTextArea对象的setBackground方法设置组件的背景色。 4.4文件传送模块功能实现 [文件传送]模块分析 正如现在主流的即时通讯软件一样,聊天往往是最最基本的功能,除此之外还有很多实用功能,如文件传送。在本系统中的聊天界面中点击文件传送按钮,便可以向对方发送文件,对方收到消息后可以选择接收文件把文件保存到本地,该功能实现如图4-10、图4-11。 本科毕业设计 文件对话框界面的实现是基于第三方包,代码中使用了JFileChooser对象,通过调用该对象的showSaveDialog和showOpenDialog方法来实现打开文件对话框和保存文件对话框。使用TestJProgressBar对象,调用其setStringPainted(true)方法设置进度条的变化,可以显示文件发送进度。具体实现效果如图4-10。 本科毕业设计 图4-10 文件传送进度提示 图 4-11 文件传送模块 文件传送功能关键代码 ▪发送端: public void actionPerformed(ActionEvent arg0) { try { if (jf.getSelectedFile() != null) { // 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。 dos.writeUTF("transfer file-->" + jf.getSelectedFile().getName()); // 清空此数据输出流。 dos.flush(); readMsg = dis.readUTF(); 本科毕业设计 // equalsIgnoreCase()将此 String 与另一个 String 比较,不考虑大小写。 // 如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写), //则认为这两个字符串是相等的。 if (readMsg.equalsIgnoreCase("please transfer")) { System.out.println("start transfer!"); File f = new File(filePath); // 测试此抽象路径名表示的文件是否是一个标准文件。 if (f.isFile()) { FileInputStream fis = new FileInputStream(f); byte[] b = new byte[512]; while (fis.read(b) != -1) { dos.write(b); } fis.close(); } } }else{ JOptionPane.showMessageDialog(null, "还未选择文件!"); dos.close(); System.exit(0); } dos.close(); } ▪接收端: TestReciever t=new TestReciever(); String readSignal=""; try { ServerSocket ss = new ServerSocket(8888); s=ss.accept(); dis = new DataInputStream(s.getInputStream()); dos=new DataOutputStream(s.getOutputStream()); readSignal=dis.readUTF(); System.out.println("a client connected!"); System.out.println("readSignal:"+readSignal); if(readSignal.contains("transfer file-->")){ if(JOptionPane.showConfirmDialog(null, "是否接收文件"+readSignal.substring(16)+"?", "提示:", JOptionPane.YES_NO_OPTION)==JOptionPane.NO_OPTION){ System.out.println("不接收");} else{ System.out.println("接收"); TestReciever.jf.setSelectedFile(new File(readSignal.substring(16)));//设置默认的保存文件名 本科毕业设计 if (TestReciever.jf.showSaveDialog(null) ==JFileChooser.APPROVE_OPTION&&TestReciever.jf.getSelectedFile().getName()!=null) { System.out.println(TestReciever.jf.getSelectedFile().getName()+"文件保存"); File ff=new File(TestReciever.jf.getSelectedFile().getAbsolutePath()); ff.createNewFile(); jt.setText( jf.getSelectedFile().getAbsolutePath()); dos.writeUTF("please transfer"); int a=0; FileOutputStream fop=new FileOutputStream(ff); while((a=dis.read())!=-1){ System.out.println("a="+a); fop.write(a); } fop.flush(); fop.close(); dos.close(); dis.close(); } 4.5后台管理模块功能实现 [后台管理]模块分析 作为用户我们只是使用了QQ的客户端功能,即我们电脑上安装的QQ软件。其实为了保证QQ的正常运行,腾讯在各地都有自己的代理服务器,以提供足够的带宽和计算能力。在QQ的身后,自然会有强大的后台支撑,这保证了我们用户能够享受到腾讯QQ高质量的服务。本系统模拟了一个简单地后台管理的功能,提供了服务管理、用户管理、消息管理三大功能。 (1) 服务管理 在服务管理里面,管理员可以启动和关闭服务器,实际上就是启动服务器端一些线程,开始监听来自客户端登录的请求,并随时做出相应的处理。同时查询数据库,返回用户信息。在这里管理员还可以发送弹窗消息给所有在线用户,可以发布群公告。 这个界面使用了tabbedPane对象和GroupLayout布局管理器,在一个GroupLayout里放置了3个tabledPane对象以供切换。日期、时间的显示是 本科毕业设计 通过Calendar对象获取系统当前日期时间来实现的。此外,服务器运行时间是用Timer计时器来实现的。具体功能实现如图4-12、4-13所示。 图4-12 服务管理界面 图4-13 系统公告界面 (2)用户管理 本科毕业设计 用户管理就是对系统注册用户信息的管理,可以查找、删除、修改相关内容,实质上就是通过JDBC对数据库的操作。这个面板中使用了JTable对象以实现对数据库表的加载显示。功能实现如图4-14所示。 图4-14 用户管理界面 本科毕业设计 (3)离线消息管理 在本系统中如果向对方发送消息是好友离线,则消息将会自动保存在服务器的数据库上,待好友上线时再推送过去。离线消息管理就是实现的这样一个功能。例如3号用户“mj”给没有上线的1号用户“niaopeng”发送消息后,消息内容会存储到数据库中的msg表中。每当用户上线时,程序单独启动一条线程MsgManageThread根据消息对象Msg的SendFrom和SendTo属性去检测该用户有没有离线消息。若有,则执行receiveMsg操作接收离线消息。界面依然是由tabbedPane对象和GroupLayout布局管理器以及JTable等控件构成。具体实现如图4-15所示。 图4-15 离线消息管理界面 本科毕业设计 第五章 总结 本次毕业设计的即时聊天系统,主要是以学习研究为目的,所有实现的功能都是最基本的。尽管这样,我还是做了很多准备工作,搜集了相关论文,参阅了相关书籍。由于系统界面设计较为繁杂,不像之前用Visual Studio可以拖控件,界面很快搞定,所以初期花费了不少时间去了解Java界面开发相关知识。这种搜集和学习相关知识的方法和经历对自己以后做课题研究有很大的启发意义。 在进行系统的分析与设计中我熟悉了从现状描述到系统建模以及系统实现的整个过程,这将自己以前在课堂上所学的基础知识及课外所学的知识串连起来,综合应用到一个真实的系统中去。编制系统开发计划使自己对分析设计的所有工作和进度有了清楚的了解。我深刻地认识到系统的可行性分析十分重要,这将决定系统的开发价值。如何实现服务器和客户端的通讯是本系统分析的重头,通过参考李刚和孙卫琴两位业界知名Java讲师的著作,我理解了如何用Java实现网络通信。然后将其转化为数据流程图,使自己理清了系统的工作思路,对于系统的流程有了清楚的把握。数据库的设计使自己学会了如何分析用户的需求,设计出合理规范的数据库。数据库设计是系统实施的一个基础,是整个系统后台的支撑。系统开发过程中我学习了使用MySQL进行数据库建表的相关知识,受益很多。 本系统采用免费开源的Eclipse开发,由于时间有限,只开发了登录、注册、文字聊天、文件传送、后台管理五个模块,通过动手编程使自己又重新回顾了Java语言的相关知识,熟悉了操作平台。在本系统开发的开发过程中我遇到了一些棘手问题,每遇到一个问题,我都想办法去解决,在这个过程中我充分利用了网络资源。有时在IT技术论坛CSDN论坛上发帖求助,也因此了解了一些论坛牛人,学到了不少知识。经过我的钻研,有的问题已经解决但还有一些期待实现。 成功解决的问题: 1、服务器端如何处理客户端的不同请求。客户端有时是请求登录验证,有时是请求返回好友列表,有时是请求发送文字消息给对方。开始的时候不知道怎么去做,然后查询了相关资料,参照别人的做法,设计了一个Message类,这个类不仅仅是字面意思消息,它是服务器客户端通信的实体,不管是聊天消息还是登录请求,任何服务器客户端的通信都封装成Message发送,接收方收到后根据Message对象的属性自行判断是何种消息,然后做相应处理。 本科毕业设计 2、离线消息推送。给不在线的人也应该能发送消息,但是对方如何接收到呢?这个问题我是这样解决的。凡是给不在线好友发送消息,统一写入数据库。每次客户端用户登录,首先执行一条线程,这条线程用来检测数据库msg表是否存在内容,有的话就按照发送方接收方推送给指定用户,然后删除数据库的离线消息。这个方法虽然笨了点,有冗余的操作,但是功能实现了。 3、文件传送。如何将不同格式的文件发送给对方也让我一筹莫展。后来查阅书籍学习Java数据流的相关知识后恍然大悟。所有的文件不都可以转化为二进制的字节流吗,这样就可以实现底层的数据传输了。发送方将消息写入数据流,接收方再从数据流中读取还原出对象即可。 期待解决的问题: 1、完成用户隐身登录不影响消息接收及记住密码自动登录的功能。 2、保存任何用户的聊天记录,并以加密的形式存储在数据库中。 3、完成好友搜索,添加好友、好友访问权限设置相关功能。 4、完成对用户的管理,如踢用户下线,给指定用户发送系统通知等。 当然功能越想越多,有的是技术问题,有的是时间问题,总而言之期待以后完善。 本科毕业设计是对自己四年所学的一次综合性检验,虽然在做毕业设计的过程中遇到很多困难,但通过上网和查书解决了很多从未遇到过的问题,感觉很有成就感。这次的毕业设计确实让我学到了很多知识。最大的感概就是系统开发之前的设计是尤为重要的,这决定了系统开发的工程量、效率。设计能力才是检验一个软件工程师水平的指标。站在软件开发技术金字塔顶端的往往是那些资深的系统架构师,这应当成为我的奋斗目标!大学里学的课程如数据结构与算法、计算机组成原理、操作系统等课程正是为我们走向 本科毕业设计 “金字塔”铺路的,只有基本功扎实才能在IT技术领域游刃有余。 本科毕业设计 致谢 衷心感谢马福民老师在本次毕业设计的系统开发和毕业论文撰写过程中对我的指导和帮助。从最初的选题,到系统的设计和功能的实现,马老师一直细心地对我进行专业地指导。尤其是在我一边忙着考研一边做毕业设计的过程中,更是给予我莫大的鼓舞和帮助,最后使得我的毕业设计能够顺利的完成。 本科毕业设计 参考文献 [1]李刚,疯狂Java讲义[M].北京:电子工业出版社,2008-10. [2](美)Joshua (著),Effective Java[M].北京:机械工业出版社,2009-01. [3]阎宏,Java与模式[M].北京:电子工业出版社,2002-10. [4]王珊,数据库系统概论(第四版)[M].北京:高等教育出版社,2008-06. [5](美)Abraham Silberschatz Henry F.Korth,S.Sudarshan(著),Database System Conoepts[M].北京:机械工业出版社,2012-04. [6] 杜佳荣 ,马建红 ,滕振宇,Java网络编程技术与实践[M].北京:清华大学出版社,2008-06. [7] 崔洋,贺亚茹 (著), MySQL数据库应用从入门到精通[M].北京:中国铁道出版社,2013-01. [8]孙卫琴,Java面向对象编程[M].北京:电子工业出版社2006-07. [9]孙卫琴,Java网络编程精解[M].北京:电子工业出版社,2007-03. [10](美)GavinPowell(著),沈洁,王洪波,赵恒(译),数据库设计入门经典[M].北京:清华大学出版,2007-03. [11](美)Roger S.Pressman (著),郑人杰,马素霞 等(译),软件工程:实践者的研究方法[M].机械工业出版社,2011-08. [12]钱乐秋、赵文耘、朱军钰.软件工程[M].北京:清华大学出版社,2006. [13]陈刚. Eclipse从入门到精通[M].北京:清华大学出版社,2005. [14]胡荷芬、张帆、高斐.UML系统建模基础教程[M]. 北京:清华大学出版社,2010. [15]熊小敏,刘瑛,陈惠清. 基于Java的网络即时通讯系统的设计与实现[J].计算机与现代化,2005,12,028. [16]宫学生,马洪连,丁男,移动通信软件框架的设计与实现[J].计算机系统应用,2010,05,004. 本科毕业设计 附录 1、系统使用配置说明 本系统使用Eclipse开发,由于系统包含客户端程序和服务器端程序两部分,因此不能够一起打包安装运行。需要分别打包,分别在机器上安装配置。实际上本系统并未设计得很周全,程序中的服务器端Socket连接的IP地址是写死的。因此最好是直接导入Eclipse中运行,演示效果最佳。 导入步骤:打开Eclipse-选择文件-导入-常规-现有项目到工作空间中,在文件选择目录中找到项目文件夹Mybs导入即可。然后右击项目中的src文件夹下的Server包中的QQServer.java,选择运行方式-java应用程序。再右击Client包下的QQClient.java,选择运行方式-java应用程序即可。 2、系统源程序清单及说明 client.common包:编写客户端的一些通用组件 client.control包:编写客户端的一些控制流程,如注册、登录、聊天等等 client.frame包:编写客户端的界面 client.img包:存放系统用到的图片 client.socket包:存放客户端网络通信相关的程序 com包:存放一些工具的包,如本系统中的界面居中、界面风格设置等功能。 com.socket包:存放网络通信相关的程序 server.common包:编制服务器端的一些常用功能,如JDBC server.dao包:封装对服务器端数据库的数据访问功能 server.entity包:封装服务器端的一些实体,如消息msg、用户user server.frame包:编写客户端的界面

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档