




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/S架构的即时聊天系统的设计与实现第一章 引言1.1选题背景和意义随着经济全球化的发展,世界各地的不同人、组织、机构之间的联系越来越密切。同时伴随着互联网技术的普及和发展,网络即时通信工具已经作为一种廉价、方便的信息交流工具越来越受到人们的青睐。在21世纪初的短短十几年间,即时通信系统(IM)的发展不断地取得了惊人的成就。从早期只能互相发送字符并显示在双方的屏幕上的实时通信程序到现在的图形化、面向互联网、多功能的即时通信系统,科学技术的进步和整合不断地促使着即时通信系统功能越来越丰富,用处越来越广泛。从最早的即时通讯软件ICQ诞生至今,市场上不断涌现出类似的产品。不少厂商分别推出了自己的IM,如腾讯QQ、阿里旺旺、新浪UC、移动飞信等,这些都是我们所熟悉的PC端的即时通讯软件。随着智能手机、平板电脑的普及,一些移动端的即时通信系统也如雨后春笋般涌现出来,如小米公司的米聊,腾讯公司的微信,还有年轻人之间很流行的陌陌、游戏玩家常用的YY语音等。这些软件本身功能也越来越丰富,远远超出了单纯的即时聊天系统的范畴。现在的即时通信系统不仅仅是人们的沟通工具,还成为了人们利用其进行电子商务、工作、学习等交流的平台1516。在当今社会,不管是个人用户还是企业用户,对沟通的需求总是在不断地发展。传统的沟通交流方式如电话、传真、邮件等已经不能完全满足人们学习、工作、生活的需要。随着计算机软件、计算机网络和移动通信技术的发展融合,集方便、廉价、快捷、实时等优点于一身的即时通讯系统可以说是继电子邮件、万维网之后,互联网上最具有杀伤力的应用。很难想象一台个人电脑没有安装像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更具备了显著优势和广阔前景18。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为框架开发自己的IDE13。(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等来实现69。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架构的即时通讯系统设计31系统详细设计 3.1.1 系统总体流程图在系统开发之前,先对系统进行了整体设计,系统流程图如图3-1。开始启动服务器否判断启动信息是启动客户端否注册用户判断登录信息是登录成功即时聊天退出客户端关闭服务器结束图3-1系统总体流程图 3.1.2 系统总体功能模块划分本系统主要分为注册、登录、聊天、文件传送、后台管理五大模块。整个系统的详细结构如图3-2所示。图 3-2 系统总体功能模块划分注册模块基于C/S架构的即时聊天系统文件模块登录模块聊天模块后台管理模块发送文字发送表情发送文件接收文件服务管理用户管理消息管理群组聊天各个功能模块设计如下:1、注册模块在登录界面上有注册按钮,用户可以点击注册,填入个人相关资料,提交给服务器。服务器接收到信息后通过纯JDBC方式或者JDBCODBC桥接的方式连接数据库并添加记录。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图45。系统总体E-R模型:图3-8系统总体E-R图账 户账户名账户密码账户ID拥 有用户信息上次登录日期用户性别用户状态用户IP上次退出日期用户头像用户生日用户邮箱拥 有离线消息消息ID消息发送时间消息类型消息发送者消息内容消息接受者111N用户的基本信息E-R模型:用户(用户ID,用户名,用户密码,用户IP地址,用户状态,用户性别,用户邮箱,用户最近一次登录日期,用户上一次退出日期,用户签名,用户头像,用户生日)用户信息用户ID上次登录日期用户性别用户状态用户IP用户密码用户名上次退出日期用户头像用户生日用户邮箱图 3-9用户信息E-R图离线消息的E-R模型:消息(消息ID,消息内容,消息发送者,消息接收者,消息发送时间)消息信息图 3-10聊天消息E-R图消息ID消息发送时间消息类型消息发送者消息内容消息接受者3、逻辑设计本系统的数据库名称是MyIM,该数据库中包含了两张表,分别为用户信息表、聊天消息表。下面简要介绍这两个表的设计。(1)用户信息表: 该表中记录了本系统所有注册用户的用户名及其密码,以及其它一些个人信息。用户可以在客户端登录窗口通过输入用户名和匹配的密码登录,用户信息中只要有两者之一与该表内容不符便无法登录,系统会给出出错提示。该表的设计如下:表1 用户信息表字段名数据类型是否是主键U_IDint是U_NAMEvarchar(50)否U_PWDvarchar(50)否U_IPvarchar(50)否U_STATEvarchar(10)否U_GENDERvarchar(50)否U_EMAILvarchar(50)否U_LAST_LOGINdate否U_LAST_EXITdate否U_HEAD_IMGvarchar(50)否U_BIRTHDAYdate否(2)离线消息表:记录了用户发送给离线好友的消息,管理员可以查看。包括发送者、接受者和消息产生的时间等。表2 聊天消息表字段名数据类型是否是主键MSG_IDint是MSG_CONTENTvarchar(2000)否MSG_SENDFROMint否MSG_SENDTOint否MSG_TYPEvarchar(2)否MSG_SENDTIMEdate否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 MENT 用户ID, U_NAME varchar(50) NOT NULL MENT 用户名, U_PWD varchar(50) NOT NULL MENT 密码, U_IP varchar(50) DEFAULT NULL MENT IP地址, U_STATE varchar(50) DEFAULT NULL MENT 用户状态, U_GENDER varchar(50) DEFAULT NULL MENT 性别, U_EMAIL varchar(50) DEFAULT NULL MENT 电子邮件, U_LAST_LOGIN date DEFAULT NULL MENT 最后一次登录, U_LAST_EXIT date DEFAULT NULL MENT 最后一次退出, U_SIGNATURE varchar(100) DEFAULT NULL MENT 个性签名, U_HEAD_IMG varchar(100) DEFAULT NULL MENT 头像, U_TYPE varchar(50) DEFAULT NULL MENT 类型, U_BIRTHDAY date DEFAULT NULL MENT 生日, 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 MENT 消息ID, MSG_CONTENT varchar(2000) NOT NULL MENT 消息内容, MSG_SENDFROM int(11) NOT NULL MENT 消息发送者, MSG_SENDTO int(11) DEFAULT NULL MENT 消息接收者, MSG_SENDTIME date NOT NULL MENT 消息发送时间, MSG_REMARK varchar(3000) DEFAULT NULL MENT 备用, MSG_TYPE varchar(2) DEFAULT NULL MENT 消息类型,如是群聊消息还是私聊消息, 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用户登录机器IPprivate 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(, 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、JboBox等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 (Gender.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/ 个性签名+ boBoxHeadImage.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+ boBox状态.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方法可以改变图形界面的外观风格114。消息弹窗界面使用了JTextArea组件,并沿用了登录窗口的背景图片。弹窗效果的实现主要是靠3个定时器Timer对象:1、 平滑移动的定时器,使得窗口从右下角缓慢移动到适当的位置。2、 窗口停留定时器,移动到合适位置后,开始计时,15秒后窗口自动消失,也可以自行点击关闭。3、 窗口关闭定时器,关闭时采用透明渐变的方式,完全透明时自动退出。图4-7的聊天界面中运用了两个JTextPane对象,一个用作发送消息,一个接收。在JTextPane中加入了TestJProgressBar对象,使其成为带有滚动条的文字显示区域。上方的工具条和右侧的仿QQ秀用的是JLabel对象,在JLabel中调用setIcon方法添加不同的背景图片。由于要使得点击传送文件的图标就能够触发该功能,所以给此JLabel对象加入监听事件,使其成为一个事件源。2、聊天室聊天模块分析正如QQ的群功能一样,本系统也模拟了一个群聊天的功能。点击好友列表界面的群组选项卡里的“进入官方聊天室”按钮,在这里可以实现消息的广播发送。进入官方聊天室后,用户发送的消息将被推送至所有在线用户。这里设置了多个Thread
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省青岛市平度一中2026届化学高一第一学期期中考试试题含解析
- 2026届上海市第二工业大学附属龚路中学化学高一第一学期期中学业水平测试试题含解析
- 辽宁省辽阳县集美学校2026届化学高三第一学期期末质量跟踪监视模拟试题含解析
- 2025年幼儿教育保教知识与能力专项训练试卷
- 2026届甘肃省武威一中 化学高二第一学期期末检测模拟试题含答案
- 2025年电气工程师电气设计专项训练试卷及答案解析
- 2026届江苏省苏州市第五中学校化学高二上期中监测模拟试题含解析
- 现代五项障碍跑训练课件
- 王维个人简介课件
- 眼睛知识考试题目及答案
- 立杆方法分类普通电杆的组立系列课件
- 四年级音标试卷及答案
- 学校食堂运营管理职责与分工
- 2025云南师范大学辅导员考试题库
- BEC商务英语(中级)阅读模拟试卷11(共405题)
- 会计师事务所公司质量控制制度范本
- 语文课堂教学目标设计“四出发”
- 2025《义务教育信息科技课程标准(2022年版)》测试题库及答案(共4套)
- 2025年度建筑劳务木工班组施工合作协议
- 《环境保护法》知识参考试题库200题(含答案)
- 食堂食材配送采购投标方案(技术标)
评论
0/150
提交评论