基于Android的网络聊天软件的设计与实现

Benjamin

发布日期: 2019-05-15 10:57:04 浏览量: 612
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

即时通信(Instant Messaging,IM)软件产生以来,这种通过网络与其它在线用户进行交流的方式,受到了个人公司以及行业的青睐。本文采用软件工程的管理和设计方法,对项目的需求进行了分析,完成了功能用例建模,使用Socket通信技术结合TCP/IP协议原理实现了基于Android操作系统的聊天软件各个模块的分析设计,提出了系统的体系结构和整体架构设计方案,并予以实现,取得了较好的使用价值。

关键词:Android;即时聊天;客户端/服务器模型;套接;

Abstract

Since the invention of instant messaging (IM), such style which online users communicate with others on the net, has become more and more welcomed by individual, company and software industry. This paper using the software engineering management and design methods to analyze the requirement of project, and implement the construction of function model. With the socket communication technology combined with the TCP/IP protocol finished all of the modules in chat software which runs in Android Operation. Propose and carry out the system architecture and overall architecture design, get a good value in use.

Key words: Android; Instant Messaging; IM; C/S; Socket;

1 绪论

1.1 项目背景

即时通信(Instant Messaging, IM)是随着互联网的出现而新型通信手段,根据通讯软件的发展与分析,作为即时通信工具中最具有增长潜力之一的聊天软件,它为满足人们的需要,将其功能不断的完善,不但可以文字聊天和文件传输,还可以通过语音,视频来聊天,所以其发展十分迅速。而随着3G时代的来临,其与移动客户终端的结合更受到了广泛的关注。本项目来自以下当前受到关注的启发。

  • 开放性移动设备Android平台目前受到了很多人的喜爱,并且在短短几年取代了诺基亚成为全球最热销的手机

  • 随着手机成为人们日常生活的必需品,通过PC端进行即时聊天已经不能满足人们的需求,人们需求多终端的聊天即手机和PC的互通

本系统通过Socket通信实现Android手机间互通,Android手机和PC端的互通。

1.2 研究的目的和意义

即时通信软件作为一种便捷的网络通信技术已经越来越深入人心,应用范围从单纯的网络聊天工具变成工作生活所不可缺的信息交流平台。在互联网日益普及的今天,即时通信的用户规模也呈现出快速增长的态势。

现阶段,通过手持设备终端和即时通信软件挂钩,把以往的只能应用在PC机上的即时通信软件移植到移动设备中,让用户能够更方便地应用即时通信产品,是即时通信的发展趋势,也是IM系统软件市场发展的一个重要方向。

1.3 国内外研究的现状

1996年11月ICQ在全球发布,拉开了IM(Instant Messaging,即时通信)应用的序幕。就是这样一款小软件在短短数年时间里发展出了一个巨大的IM产业。

时至今日,即时通信工具早已成为最热门的网络应用之一。国外除了ICQ外还有雅虎的雅虎通、微软的MSN、被eBay收购的Skype和Google的Gtalk都在国际上占有不小比重。

相较于国内,腾讯QQ无疑是国内即时通信市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使面对微软MSN的强大攻势,腾讯QQ的市场占有率依然稳步增长,到现在占据市场70%以上份额。除了腾讯以外,国内的IM还有Lava,UC等软件。

1.4 论文的主要内容和组织结构

本文的研究工作是设计和实现一个Android平台的即时通信系统,实现移动设备与PC终端的互通。采用TCP/IP 协议,在Google推出的Android平台下进行研究工作。本文的研究内容主要有下面几方面:

  • Android平台[1]上即时通信系统的架构:提出整个系统的合理架构以实现整个系统

  • TCP/IP协议:介绍TCP/IP协议的内容并对协议进行解析

  • 移动即时通信系统的实现:根据提出的系统架构,并阐述本移动即时通信系统的设计和具体实现,最终对系统进行演示和运行

本文在第二章介绍项目所用到的基本知识,对Android平台、TCP/IP协议以及MVC架构进行介绍,讨论在Android平台下程序的开发以及开发所需的环境。

然后在第三章根据项目具体要求得出需求分析,依照画出的用例模型将系统分为客户端和服务器端。在第四章中详细的阐述的具体的功能的流程和系统实现的原理。

第五章介绍了一些重要功能实现的代码及解释。

第六章为程序的演示和运行。

1.5 本章小结

本章主要介绍了项目的背景、研究的目的和意义以及国内外实时聊天系统的研究和应用现状,同时列出来整篇文章的主要章节结构,为后续的部分介绍做出了提纲。

2 关键技术介绍

毕业设计是对四年学习内容的一个综合考验,因此将会涉及到多门课程的知识。结合本课题的研究内容,本章将会把毕业设计过程中所遇到的关键技术进行一个全方位的阐述。

2.1 Android平台

Android操作系统是由谷歌Google和开放手机联盟共同开发发展的移动设备操作系统,其最早的一个发布版本开始于2007年11月的Android 1.0 beta,并且已经发布了多个更新版本的Android操作系统。

到2010年末数据显示,仅正式推出两年多操作系统的Android在市场占有率上已经超越称霸十年的诺基亚Symbian系统。2012年2月,Android操作系统在全球智能手机操作系统的市场份额已达52.5%,成为全球第一大智能手机操作系统[2]。

2.1.1 Android特征

  • 提供访问硬件的API函数,简化像摄像头、GPS等硬件的访问过程

  • 具有自己的运行时和虚拟机

  • 提供丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性

  • 提供轻量级的进程间通讯机制Intent,使跨进程组件通信和发送系统级广播成为可能

  • 提供了Service作为无用户界面,长时间后台运行的组件

  • 支持高效、快速的数据存储方式

2.1.2 Android体系结构

采用软件堆层的架构,共分为四层如下图2-1[3]:

  • Linux 内核

    • 硬件和其他软件堆层之间的一个抽象隔离层
    • 提供安全机制、内存管理、进程管理、网络协议堆栈、和驱动程序等
  • 中间件层

    • 由函数库和Android运行时构成
  • 应用程序框架

    • Activity Manager,管理应用程序的生命周期
    • Windows Manager,启动应用程序的窗体
    • Content Provider,共享私有数据,实现跨进程的数据访问
    • Package Manager,管理安装在Android系统内的应用程序
    • Teleghony Manager,管理与拨打和接听电话的相关功能
    • Resource Manager,允许应用程序使用非代码资源
    • Location Manager,管理与地图相关的服务功能
    • Notification Manager,允许应用程序在状态栏中显示提示信息

  • 应用程序
    • 提供一系列的核心应用程序
    • 包括电子邮件客户端、浏览器、通讯录和日历等

2.2 TCP/IP协议

TCP协议是网络通信的基础核心协议,在Java中也专门提供了Socket的类库,抽象出了基于TCP协议通信的常用方法:TCP协议与三次握手。本节在讲述TCP协议流程前,先来要对一些概念进行说明。

2.2.1 C/S模型

在网络连接模式中,除了等网外,还有一种形式的网络,即客户机/服务器网络。在该模型中,服务器是网络的核心,而客户机是网络的基础,客户机依靠服务器获得所需的网络资源,而服务器为客户机提供网络必须的资源。通过C/S模型可以从分利用两端硬件环境的优势,将任务合理分配到客户端和服务器端来实现,所以C/S模式具有以下几个优点:

  • 因为在客户端上有一套完整的系统软件,具有很强的交互性,系统工作人员在运用系统时可以获得出错提示、在线帮助等较强功能

  • 由于C/S模式是配对的点对点的结构模式,因此多采用局域网的协议,并且通常是学校内部固定的从事学生学籍管理工作的用户群,所以安全性较高

  • 因为C/S模式只有两层逻辑结构,因此网络通讯量低,传输速度快,占用网络资源少

随着Android手机性能的不断提升,使用C/S架构将一些需要较长时间处理的功能放置到客户端。使用户得到更好的网络传输,提升用户体验。

2.2.2 TCP协议

为了实现客户端同服务器端的通信,客户端首先发送一个“SYN”数据包。如果服务器收到SYN标记,它将发回一个“SYN+ACK”数据包。接着,客户端为了表示收到了这个SYN+ACK信息,会向服务器发送一个最终确认信息(ACK包)。这种SYN,SYN+ACK,ACK的步骤被称为TCP连接建立时的“三次握手”,在这之后,连接就建立起来了,这个连接将一直保持活动状态,直到超时或者任何一方发出一个FIN(结束)信号。这种通信模式也叫客户端/服务器(C/S)模式 如下图2-2 TCP的三次握手。

由此可见,通过客户端和服务器的“三次握手”,双方可以建立畅通的通信信道,在此信道上双方互相传输数据。

由于TCP/IP协议能够保证数据的安全传输和正确到达目标主机,本文所涉及到聊天系统采用TCP/IP协议,从而能够实现更加精确即时的消息发送和接受。

2.2.3 Android的MVC架构

在系统客户端中,采用MVC模式的设计思想,提高了程序的模块化程度。在本系统客户端中,结构图如下:

视图层(View)

视图提供界面功能显示的机制,主要是用户数据的输入界面和对模型数据的显示功能,同时也包括信息的提示功能。这方面主要是引入了Xml配置文件其中包括样式布局文件(Style)、动画效果布局文件(anim文件夹下)、图片布局文件(drawable文件夹下)。

控制层(Control)

主要负责对整个系统的流程进行调度,管理用户界面的逻辑流程,以及用户交互如何影响数据模型和数据模型如何影响用户交互过程这些东西都是有Android中的Activity完成的,在Android开发中,其配置文件AndroidManifest.xml扮演控制器的角色,文件中对各种组件视图进行相应的配置,以供模型在改变时对视图的调用。

模型层(Model)

主要对数据库的增、删、改、查等操作。同时包含了信息的接受,发送,请求的提交。具体到在程序中是通过Service实现数据的发送,接受。当一个Activity启动后动态的调用bindService函数将其与Service绑定,关于这一块后面会详细解释。

2.3 多线程技术

多线程在构建大型系统的时候是需要重点关注的一个重要方面,特别是在效率和性能之间做一个权衡的时候。恰当的使用多线程可以极大的提高系统性能。使用多线程的好处有以下几点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理

  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

  • 程序的运行速度可能加快

  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等

而Java是一种多线程的语言,它可以同时运行多个线程处理多个任务。同时Java内置多线程控制,这样可大大简化多线程应用程序的开发。提供了一个Thread类,它封装了所有有关线程的控制,负责线程的启动、运行、休眠、挂起、恢复、退出和终止等一系列逻辑控制操作,并可检查线程的状态。此外Thread类还实现了对线程行为的优先级的控制。

2.4 运行环境

  • 操作系统:Windows XP 或者 Windows 7

  • 数据库:SQLite(Android提供的一个标准的数据库,支持SQL语句),MySQL 5.0

  • Android 版本:Android 2.2

  • 开发工具:eclipse+android SDK+MySQL5.0

2.5 本章小结

本章主要介绍了Android聊天软件在开发过程中用到的关键技术,包括Android系统的体系结构、C/S模型、TCP协议以及多线程技术。同时介绍了软件开发的硬件和软件环境。

3 需求分析

上章介绍了本系统所需要的软硬件配置以及关键技术。本章将开始着重分析系统的需求,从系统功能和可行性分析两个方面明确系统所要实现的目标,为系统的开发做好铺垫。

3.1 系统的整体分析

本项目根据用户的需求,对即时通信的常用功能进行实现,系统的功能用例图如下3-1系统用例图

通过用例图可以知道,系统的主要实现功能大体上可以分成:

  • 用户注册:用户如果没有可用的ID,可填写相关的个人信息(要注册的ID、密码等)进行注册,向服务器提交后服务器返回相应的信息

  • 用户登录:用户名和密码进行登录即时通信系统

  • 用户设置:可对用户的基本信息和一些系统选项进行设置

  • 查看好友信息:登录成功后,可以按照分组查看所有的好友概要信息(用户名、用户ID),并可以查看某个好友的详细信息

  • 用户添加、删除好友:根据其它用户的ID添加进自己的好友至好友列表

  • 用户向好友发送信息:用户登录成功后可给某位好友发送信息,如果好友不在
    系统将提示该好友不在

  • 用户接收好友的信息:用户登录成功后会监听好友发送过来的信息,并显示在
    相应的界面上

  • 用户注销:用户注销,退出本系统

系统采用C/S架构模式,所以在进一步细化过程中将系统分为服务器端和客户端两部分。

3.1.1 服务器端

在C/S架构中,服务器端起到了连接客户端并且处理客户端请求的作用。服务器的功能模块图如下图 3-2,该部分的功能需求主要实现功能有:

  • 用户登录验证:将用户提交的账号和密码在服务器端验证

  • 信息的转发:通过服务器将用户的信息转发给其他用户

  • 刷新在线好友:接到用户的信息后返回该用户的在线好友信息

3.1.2 客户端

在C/S架构中客户端是核心部分,是该网络基本通信模型。客户端通过服务器获得所需的信息,所以客户端的功能模块图如下图3-3所示。其相应的功能解释已经在上面的系统用例图中解释过,这里不再累述。

3.2 可行性分析

从技术方面将本系统的开发利用MySQL5.0作为本系统的数据库,它是一个支持多用户的新型数据库,适用于中小规模的数据量需求。使用Java作为系统开发的开发环境,它提供完善的指令控制语句、类与对象的支持及丰富的数据类型,给开发高性能系统提供的保障为开发满足客户要求的系统,保证了代码的模块化要求,而代码模块化的提高,非常有利于以后对新系统的扩展与修改。

从运行方面将本系统为一个小型的聊天系统,所耗费的资源非常的小,现在一般的Android手机无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。

经过了对Android平台聊天客户端的详细分析.可以确定在Android平台上对基于TCP/IP协议的客户端开发从技术上和运行方面来说是可以实现的。

3.3 本章小结

本章主要明确了需求分析,根据C/S模型将系统分为服务器端和客户端。再通过对系统的进一步分析后,得到了服务器端和客户端的功能模块图。同时从技术和运行两方面论述了Android聊天软件的可行性分析。

4 Android聊天软件系统设计

通过上一章需求分析得到(系统的运行如图4-1所示)系统的需求分析以及大致的设计方向,本章将会从系统实现原理、服务器端、客户端与数据库设计的几个方面深层次的介绍系统所涉及的关键技术,通过这些技术的实现,系统的设计阶段将会告一段落。

4.1 系统实现原理

聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:

在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。如图4-2所示:

服务器端启动后先要调用Serversocket()函数建立一个流式套接字,并返回引用新套接字的描述符。然后将此套接字描述符与本机的一个端口建立关联,这由ServerSocket()函数来完成。服务器只有在调用了accept()函数进入等待状态之后才可以接受来自客户端的请求。一旦接收到客户端通过connect()发出的连接请求,accept()将返回一个新的套接字描述符,通过套接字描述符调用相应的流的read()或write()函数即可与客户端进行数据收发。待数据传送完成,服务器和客户端调用closes()关闭套接字。需要说明的是服务器此时关闭的是此前由accept()所返回的新套接字,而不是先前开始创建的套接字。在此套接字被关闭后,服务器将再次处于阻塞状态,以等待下一个客户端的连接请求并重复上述过程。

4.2 服务器端

服务器的流程图如下4-3所示:

服务器接收到客户的信息,进行相应的判定,将信息交给相应的功能模块进行处理。根据功能需要我将判定分为以下几类如表4-1所示:

名称 发送值 备注
CHAT 1 聊天
REFRESH 2 更新好友
REGISTER 3 注册
LOGIN 4 登录
ADD 5 添加好友
DELETE 6 删除好友
NOHAVE 7 该用户不存在和不在线
AGREE 8 同意添加好友
REFUSE 9 拒绝添加好友

4.2.1 用户登录验证模块

为了保证用户信息的安全,将用户是否合法的判定放在服务器端,通过查询数据库得出判定结果,返回给客户端。

4.2.2 信息的转发模块

采用服务器转发的方式,实现外网聊天的功能。服务器将接收到的信息转发给其他用户。其中信息类型包括CHAT、ADD、AGREE、REFUSE这四种类型。

  • CHAT 服务器判定为CHAT,则转发给与之通信的用户

  • ADD、AGREE、REFUSE三者均为同一功能——添加好友。当用户点击添加好友时,服务器接收到类型为ADD的消息,并将他转发给要添加的好友。好有用户可以选择同意添加好友和拒绝添加好友,分别向服务器发送一个类型为AGREE和REFUSE的信息

服务器则根据类型不同完成数据库的添加。

4.2.3 刷新好友列表模块

用户点击刷新列表后,向服务器发送REFRESH类型的消息,服务器将查询数据库将该用的好友列表封装,发送给该用户。

4.3 客户端

4.3.1 用户登录模块

当用户登录时,客户端由LoginActivity.java界面收集并验证用户登录信息后,封装成User对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器,服务器端将请求转发给UserDaoImpl处理,UserDaoImpl在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。如果登录成功,客户端将继续启动聊天主界面。具体流程如下图4-4所示:

4.3.2 用户交互模块

用户交互模块的功能示意图如图4-5:当用户登录成功后,客户端有MainActivity.java和ChatWindowsActivity.java界面收集用户要交互的信息后,封装成Messageinfo对象类然后通过建立在Socket的连接之上的对象输出流将用户交互信息发送给服务器,服务器端将请求类型分类转发给不同的方法处理。

4.3.3 用户注册模块

当用户注册时,客户端由RegisterActivity.java 界面收集用户注册信息后,封装成User对象类然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器,服务器端将请求转发给UserDaoImpl处理,UserDaoImpl在收到信息后将数据完整保存在对象型数据库中,如果注册成功,客户端可以返回到LoginActivity.java界面登录。流程如下图4-6所示:

4.3.4 用户设置模块

当用户登录成功后,客户端有MainActivity.java界面收集用户要交互的信息后,封装成Messageinfo对象类然后通过建立在Socket的连接之上的对象输出流将信息发送给服务器,服务器端将请求类型分类转发给不同的方法处理。用户设置的功能模块图如下图4-7所示:

4.3.5 用户注销模块

当用户点击退出按钮,客户端有MainActivity.java界面收集用户要交互的信息后,封装成Messageinfo对象类然后通过建立在Socket的连接之上的对象输出流将用户退出信息发送给服务器,服务器端将请求类型分类转发给不同的方法处理。用户注销的流程图如下图4-8所示:

4.4 Android聊天软件用户存储数据库的设计

4.4.1 SQLite 简介

SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,

还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,同时它还支持事务处理功能等等。SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库。

4.4.2 数据库设计

数据库分为客户端数据库(SQLite)和服务器端数据库(Mysql),下面将通过系统各个实体的E-R图予以详细说明。

客户端数据库

为了实现用户的快速登录,记住用户的个性化选择即当用户选中下拉列表中的账号恢复该账号用户设置的选项。建立用户表将用户的User_ID,Password,HeadImage等属性存入SQLite中,设计如下图4-9所示的数据项和数据结构。

服务器端的数据库

服务器端主要记录注册用户的个人信息,在线情况和好友,如图4-10所示:

好友关系表,如图4-11所示:

三个相应的表结构如下表4-2、4-3、4-4所示:

客户端用户表

字段名 字段类型 字段说明 备注
UserName Varchar(10) 用户名 主键
Password Varchar(10) 用户密码 不能为空
Mood Varchar(50) 心情或个性签名 可以为空
Box_remb Integer 是否记住用户密码 默认为0
Box_open Integer 用户是否接受添加好友 默认为0
Self_Image Blob 用户头像 默认为自带头像

服务器端用户表

字段名 字段类型 字段说明 备注
UserName Varchar(10) 用户名 主键
Password Varchar(10) 用户密码 不能为空
Mood Varchar(50) 心情或个性签名 可以为空
state Integer 用在线状态 默认为0
Self_Image Blob 用户头像 null

好友关系表

字段名 字段类型 字段说明 备注
UserName Varchar(10) 用户名 主键,外键
FriendName Varchar(10) 好友名 主键,外键

4.5 本章小结

本章通过对系统实现原理、客户端和服务器端以及数据库的设计,基本完成了程序的整体架构,为编码和实现铺平了道路。

5 Android聊天软件的实现

基于Android的即时通信软件是为给Android手机用户提供随时随地与好友交流的平台,主要针对Android手机用户。根据需求分析、系统概要设计以及更好地用户体验编码与实现分为数据传输的实现、客户端业务逻辑实现、服务器业务逻辑实现和界面UI实现四个部分。

5.1 数据传输的实现

本程序采用C/S模式架构,客户端与服务器端使用socket套接字实现连接,通过多线程技术完成相互通信。

Android集成了Java的运行环境所以对Java有很好的支持,本系统就使用java.net.Socket包。在服务器和客户端定义相同的Bean结构,通过序列化将对象转换成二进制流传送到服务器端,使用在服务器端定义的Bean进行反序列化,将二进制流恢复为对象代码如下:

  1. public boolean connect(User user) {
  2. boolean isok = false;
  3. try {
  4. s = new Socket("10.0.2.2", 9999);
  5. s.getOutputStream();
  6. oos = new ObjectOutputStream(s.getOutputStream());
  7. oos.writeObject(user);
  8. ois = new ObjectInputStream(s.getInputStream());
  9. type=(MessageType) ois.readObject();
  10. gf=(Group_Friend) ois.readObject();
  11. myapp.setChilds(gf.getFriends());
  12. myapp.setGroups(gf.getGroups());
  13. isok=type.isOk();
  14. if(isok){
  15. Client_To_ServerThread ccst=new Client_To_ServerThread(s);
  16. //启动该通讯线程
  17. new Thread(ccst).start();
  18. SaveClientSocket.add(user.getUsername(), ccst);
  19. }
  20. } catch (UnknownHostException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. return isok;
  28. }

5.2 服务器端的实现

5.2.1 用户登录的实现

查询数据库判定用户是否存在,如果存在则创建一个新的进程,并将这个进程添加到进程管理类中(SaveClientThread)。相关代码如下:

  1. if(sql.checkUser(user)!=null){
  2. if(sql.checkUser(user).getPassword().equals(password)){//查找数据库成功后
  3. try {
  4. Group_Friend gf=new Group_Friend();
  5. UserDaoImpl udi=new UserDaoImpl();
  6. MessageType type = new MessageType();
  7. type.setConnect(true);
  8. type.setExist(false);
  9. type.setOk(true);
  10. gf.setFriends(udi.getFriendList(null, null));
  11. gf.setGroups(udi.getGroups(null));
  12. oos.writeObject(type);
  13. oos.writeObject(gf);
  14. oos.flush();
  15. //保存该socket 并创建一个线程
  16. Server_To_ClientThread stc=new Server_To_ClientThread(s);
  17. SaveTheSocket sts=new SaveTheSocket();
  18. execu.execute(stc);
  19. sts.add(user.getUsername(), stc);
  20. System.out.println("添加"+user.getUsername());
  21. } catch (Exception e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }

5.2.2 用户退出

接收到用户退出的消息,将管理该用的线程关闭,同时将该线程从线程管理中移除。相关代码如下:

  1. public static HashMap<String,Server_To_ClientThread> hm=new HashMap<String, Server_To_ClientThread>();
  2. public static void add(String id,Server_To_ClientThread stc){
  3. hm.put(id, stc);
  4. }
  5. public static Server_To_ClientThread getThread(String id){
  6. return hm.get(id);
  7. }
  8. public static void delete(String id){
  9. hm.remove(hm.get(id));
  10. }
  11. }

5.2.3 更新好友列表

接收到用户查询好友的消息,从数据库中查询该用户好友信息,发送给该用户。相关代码如下:

  1. while(true){
  2. try {
  3. ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
  4. Messageinfo message=(Messageinfo)ois.readObject();
  5. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~"+message.getCon());
  6. if(message.getMesType()=="refresh"){
  7. gf.setFriends(udi.getFriendList(null, null));
  8. gf.setGroups(udi.getGroups(null));
  9. oos.writeObject(type);
  10. oos.writeObject(gf);
  11. oos.flush();
  12. }
  13. Server_To_ClientThread stc=SaveTheSocket.getThread(message.getGetter());
  14. System.out.println(message.getGetter());
  15. ObjectOutputStream oos=new ObjectOutputStream(stc.s.getOutputStream());
  16. oos.writeObject(message);
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }

5.3 客户端代码的实现

由于Android特定的设计Activity与Service、线程之间无法直接交互需要通过Handler、ServiceConnect等实现互通更新UI。

Activity与Service间信息的交互

从Linux的概念空间中,Android的设计每个Activity都是一个独立的进程,每个Service也都是一个独立的进程,Activity,Service之间要交换数据属于IPC(进程间通信)。通过Binder实现Activity与Service的通信,Binder是Android系统提供的一种IPC。

在Activity中实现ConnectService对象,在Service中实现一个类继承Binder,通过BinderService函数绑定Service,在绑定Service的同时将回调ConnectService中的onServiceConnected方法,实例化一个Service对象从而实现在Activity中调用Service中的方法。ConnectService的实现:

  1. private ServiceConnection conn = new ServiceConnection() {
  2. @Override
  3. public void onServiceConnected(ComponentName name, IBinder service){
  4. // TODO Auto-generated method stub
  5. mService = (ConnectSerivce.LocalBinder) service).getService();
  6. }
  7. @Override
  8. public void onServiceDisconnected(ComponentName name) {
  9. // TODO Auto-generated method stub
  10. mService = null;
  11. }
  12. };

Binder的实现

  1. public class LocalBinder extends Binder {
  2. public ConnectService getService() {
  3. return ConnectService.this;
  4. }
  5. }
  6. public IBinder onBind(Intent intent) {
  7. // TODO Auto-generated method stub
  8. return binder;
  9. }

Activity调用Service中的方法

  1. public booleam mLogin( final User user){
  2. return mService.serviceLogin(user);
  3. }

上面实现了Activity向Service发送数据,而Service和线程向Activity发送数据则要通过Handler来时实现相关代码如下:

调用Handler

  1. private void judgeToSend(Message msg){
  2. ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
  3. ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
  4. String name=cn.getClassName();
  5. System.out.println("activity名字"+name);
  6. if(name.equals("ben.client.MainActivity")){
  7. MainActivity.handler.sendMessage(msg);
  8. }else{
  9. ChatWindowsActivity.myHandler.sendMessage(msg);
  10. }
  11. }

Handler的实现

  1. public class MyHandler extends Handler{
  2. private MainActivity main;
  3. public MyHandler (MainActivity main){
  4. this.main=main;
  5. }
  6. @Override
  7. public void handleMessage(Message msg) {
  8. // TODO Auto-generated method stub
  9. super.handleMessage(msg);
  10. 具体方法略
  11. }
  12. }
  13. }

5.4 客户端UI实现

受欢迎的软件除了具有强大的功能外,有好的界面和简洁的操作也是不可缺少的环节。Android系统到目前为止已经更新了多个版本,但是其控件的设置,界面的美化依然有很多不足。为了给提高用户的客户体验,本程序参考腾讯QQ的UI设计理念同时加入自己的一些想法。

5.4.1 半透明悬浮窗口的实现

采用popupwindows作为窗口的载体,通过setAnimationStyle方法加载动画的效果,实现窗口的侧滑出现和消失。Popupwindows的初始化代码如下:

  1. private void initPop(){
  2. LinearLayout popup = (LinearLayout) getLayoutInflater().inflate(R.layout.popup_help,null);
  3. RelativeLayout morph=(RelativeLayout) getLayoutInflater().inflate(R.layout.register, null);
  4. pop = new PopupWindow(popup,320,480);
  5. pop.setAnimationStyle(R.style.mypopwindow_in);
  6. pop.showAtLocation(morph, Gravity.CENTER, 0, 0);
  7. pop.setFocusable(true);
  8. pop.update();
  9. ImageView image=(ImageView) popup.findViewById(R.id.register_content);
  10. image.setBackgroundResource(R.drawable.morph_help);
  11. image.setOnClickListener(new OnClickListener() {
  12. @Override
  13. public void onClick(View v) {
  14. // TODO Auto-generated method stub
  15. pop.dismiss();
  16. }
  17. });
  18. }

5.4.2 主界面左右滑动切换的实现

通过自己定义的ScrollLayout控件,实现左右滑动切换。ScrollLayout继承了ViewGroup,从写了其中的onLayout和onMeasure方法。并且通过继承自定义的接口完成了数据的共享和传递。

  1. /**
  2. * 方法名称:snapToScreen 方法描述:滑动到到第whichScreen(从0开始)个界面,有过渡效果
  3. * @param whichScreen
  4. */
  5. public void snapToScreen(int whichScreen) {
  6. // get the valid layout page
  7. int lastIndex = mCurScreen;
  8. whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
  9. System.out.println("whichSc"+whichScreen+"curscreen"+mCurScreen);
  10. if (getScrollX() != (whichScreen * getWidth())) {
  11. final int delta = whichScreen * getWidth() - getScrollX();
  12. mScroller.startScroll(getScrollX(), 0, delta, 0,
  13. Math.abs(delta) * 2);
  14. mCurScreen = whichScreen;
  15. invalidate(); // Redraw the layout
  16. }
  17. for (LayoutChangeListener listener : listeners)
  18. listener.doChange(lastIndex, whichScreen);
  19. }
  20. postInvalidate();
  21. }
  22. }

5.5 本章小结

通过本章实现了客户端和服务器端的大致功能,包括用户的注册、登录、设置头像添加删除好友、与好友进行聊天等。在没有进过测试的情况下,程序还有许多未能发现的问题,这些问题将通过系统测试发现,更正。

6 系统演示与运行

为了确认基于Android的聊天软件能够准确而又完整地体现该软件最初设计,同时完成各项具体功能需求,因此对系统的部分主要功能进行了实际运行测试。

6.1 用户登录演示

用户登录系统后进入登录界面,用户登录界面如下图6-1:

用户登录需填写账号和密码,验证成功后跳转到好友列表界面。同时用户可以点击下拉菜单,选择以往登录记录快速登录。效果如下图6-2所示

用户在有选择以往登录记录的权利,同时也有删除登录记录的方式。用户在选择完成后效果如下图6-3

6.2 用户注册演示

用户注册界面如下图6-4:

注册界面需用户填入必填项账号、密码、确认密码。同时用户还可以设置自己的头像(为可选填项)。点击图片设置头像,为了好的用户体验,设置了三种头像设置方式,分别为New Picture(手机拍照)、Photo Albums(本地相册)、System Photo(软件自带的图片)。测试效果如下图6-5和图6-6:

为了提醒用户怎么设置头像提供了帮助提示测试效果如下图6-7:

当用户填写完信息,设置头像头点击确定,完成注册。注册成功的界面如下图6-8

6.3 主界面演示

当用户登录成功后跳转到主界面如下图6-9所示:

主界面包含好友列表界面和最近联系人界面,通过在屏幕上左右拨动或者点击图片实现两个界面的切换。最近联系人界面如下图6-10:

6.4 聊天界面的演示

用户选择好友后进入聊天界面如图6-11所示:

6.5 本章小结

本章主要演示了软件的主要功能,通过运行效果,基本实现了Android聊天软件的功能。但是在文字传送的同时没能实现表情发送的功能。由于个人水平有限,时间也比较紧,只能实现系统的基本操作,对其它功能我会在以后的工作中进一步的学习并完善。

结束语

本文研究基于Android手机平台的聊天软件的设计与实现。从用户的角度,探讨了如何构建一个便捷的即时通信软件。基本满足了结构化、界面友好、速度快以及稳定性等特点。

系统着重研究并实现了网络应用的部分。根据实现的情况看,具有较友好的聊天界面生成效果和良好的用户体验,以及流畅的网络通信效果。好友通信可以达到基本的聊天要求。

本课题在大量阅读和参考有关理论和应用资料的基础上,归纳、总结并研究了手机聊天客户端应用,对手机聊天的设计及开发进行了分析,主要做了以下几方面的工作:

  • 了解了PC端聊天软件相应功能与操作

  • 掌握多线程方法使用

  • 熟练掌握Android相关技术

由于个人的能力和精力有限,此系统在设计和实现中存在一些还有待进一步解决的问题,具体表现如下:

  • 服务器端的数据库性能较差

  • 在软件安全上,对用户的账号与密码没有进行保证,没有对不同用户进行限制,使其用户使用手机都能上之前登陆过的账号

  • 内部沟通方面,没有添加表情等

通过毕业设计,发现自己在理论研究和实际工作能力等方面都得到了提高,受益匪浅,同时在老师的指导和课题组同学的共同帮助下,及时总结研究成果,这些无疑会对我今后的工作和学习带来很大的帮助。

参考文献

[1] 杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社 2010.1

[2] 百度百科.[EB/OL] http://baike.baidu.com/view/1241829.htm

[3] 百度图片.[EB/OL] http://image.baidu.com/

[4] Bruce Eckel.陈昊鹏(译)Thinking in Java[M].北京:机械工业出版社,2007.6

[5] 王水、张晓民.软件工程素质导论[M].河南:河南科技技术出版社,2011.2

[6] 朱丽平.UML面向对象设计与分析[M].北京:清华大学出版社,2007.

[7] 马晓玉等.Oracle 10g数据库管理应用和开发[M].北京: 清华大学出版社 2007.11

[8] 马志强.基于Android平台即时通信系统的设计与实现[D].北京: 北京交通大学,2009.

[9] 谢希仁.计算机网络(第五版)[M].北京:电子工业出版社,2009.

[10] 王小东.高性能MySQL[M].北京:电子工业出版社,2010.

[11] 减海峰,张力军.通讯软件发展现状的分析与研究[J].计算机与数字工程 2008年第二期
112-124

[12] 通过服务更新进度通知和在Activity中监听服务进度.[EB/OL] http://blog.csdn.net/liuhe688/article/details/6623924

[13] Android的消息机制.[EB/OL] http://blog.csdn.net/happy_6678/article/details/5940756

[14] 自定义布局-ScrollLayout.[EB/OL] http://www.cnblogs.com/wader2011/archive/2011/10/10/2205142.html

[15] Android学习之Bitmap Drawable byte[]转化.[EB/OL] http://www.cnblogs.com/enricozhang/archive/2011/09/29/2195601.html

上传的附件 cloud_download 基于Android的网络聊天软件的设计与实现.7z ( 26.58mb, 5次下载 )
error_outline 下载需要18点积分

发送私信

你愿苦其自身,必将掌声雷动

8
文章数
11
评论数
最近文章
eject