Android聊天室解析Word格式文档下载.docx
《Android聊天室解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android聊天室解析Word格式文档下载.docx(37页珍藏版)》请在冰点文库上搜索。
本文首先对设计一个聊天室的背景进行了分析,另外再对国内外比较流行的几款即时聊天软件进行了简单的介绍,确定了毕业设计的主要工作,开发一个在局域网内可以聊天的简易手机聊天室。
为了实现聊天室的功能,首先介绍了该项目涉及到的一些技术背景,包括TCP/IP协议,Socket“套接字”的基本机制以及需要使用的一个Serializable接口,来实现序列化与反序列化。
之后对实现该系统的可行性与该系统的总体架构进行了分析,在此基础上,对整个系统进行模块划分以及对每个模块功能的实现进行了具体的设计。
关键词:
Android,Socket套接字,C/S模式,MySQL,Serializable
注:
本设计(论文)题目来源于自选题目。
Abstract
Thissystemisdesignedasasimpleandroidmobilenetworkchatroom,whichusesthesockettoachievenetworkcommunication,userscanachieveinformationshareandcommunicatingintime.ThissystemmainlyadoptedC/S(Client/Server)mode.Mobileasclient,canimplementitsfunctionalitylikeregistration,loginandchatwithotherclients.Whilecomputerasserver,itwilllinkMySQLminidatabase,keepusers’informationinitsmemory,receivedifferentordersfromclientthusrealizethedeliveryofdata.
Thistextfirstlyintroducedthebackgroundtodesignachatroom,thenmakesummaryofcurrentinternationalanddemoticinstantmessagingservice,inthiscaseconfirmedmymaintaskofmygraduationproject:
tocreateasimplechatroonwhichcanachievecommunicatingunderlocalareanetwork.
Toachievechatroom’sfunction,firstlyintroducedreferringtechnicalbackground,includingTCP/IPagreement,Socket’sbasicsystemandtheSerializableconnectorwhichisnecessarytoSocket,inordertoimplementserializationanddeserialization.AfterImadeaanalysisofthissystem’sfeasibilityandoverallstructure.Basedonthiscomesoutthemoduledivisionofthewholesystemanddetaileddesigntoachieveeverymodule’sfunction.
Keywords:
Android,Socket,C/Smold,MySQL,Serializable
1绪论
1.1聊天室的设计背景
二十一世纪,科技的发展突飞猛进,从纸的时代飞跃进入互联网的时代。
信息的数字化、网络化,以及信息的及时性,无疑影响着每一个人。
智能手机与互联网的飞速发展,更是促进了聊天工具的发展,使及时聊天成为人们生活中不可或缺的一部分,也占据人们生活时间的很大部分。
及时聊天通过网络进行实时的沟通,不管是从实时性还是有效性上来讲,都远比信件和E-mail来得方便。
为了实现一个更好的网络互交平台,用户之间能够实时方便的传递信息。
因此,我将使用Android设计一个简易的手机网络聊天室,此聊天室是基于Socket机制的,采用的是C/S(Client/Server,客户机/服务器)模式,能够让登陆聊天室的人进行及时的聊天,并能使用表情来表达自己的情绪。
1.2国内外常用的聊天软件
谈论到聊天软件,不得不说下当前常用的几款聊天软件,国内最火的当属于腾讯的QQ,微信,国外的有ICQ,MSN等。
QQ:
为深圳市腾讯计算机系统有限公司开发的一款基于Internet的软件。
支持在线聊天、视频电话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ邮箱等多种功能,并可与移动通讯终端等多种通讯方式相连。
QQ是当前国内用户量第一的聊天软件,在2004年就已经拥有2.26亿注册用户、500多万收费用户,而且每天都在迅速的增加中。
微信:
微信也是腾讯公司的产品之一,于2011年初推出。
可以快速发送文字和照片,并且支持多人语音对讲。
在后期的版本中,微信加入了《飞机大战》等多种游戏,一时火爆中国,另外微信拥有摇一摇,漂流瓶和附近的人,也备受人们喜爱。
经过一年多的发展,用户就突破1亿,到了2012年9月,用户已经达到了2亿,等到2013年1月,用户量已经超过3亿,其增长速度越来越快。
ICQ:
英文”ISEEYYOU”,意思为“我找你”。
是互联网上最早的即时信息传递软件,在刚推出是,迅速取得了广阔的市场,同时也引领了一场潮流,同类软件迅速跟进,很快的几乎每个国家都推出了本土的IM软件。
MSN:
一款出自于微软的即使通讯工具,4大顶级个人即时通讯工具之一。
MSN除了基本的文字对话外,还拥有视频会议,语音对话,发送文件和照片等功能,也广受用户的喜爱,因此,世界各个国家都广泛的使用MSN。
1.3论文的主要工作
此次设计的简易手机聊天室,为的是给用户提供一个群聊的平台,在这个聊天室中,用户除了发文字之外,还可以发送表情来表达自己的情绪。
在项目中,本人分析了国内外几款影响较大的聊天软件,分析设计并实现了一个聊天室最基础的功能,拥有新用户注册,用户的登陆以及所有用户的群聊功能。
通过以上的工作,让本人熟悉了简易手机聊天室的开发过程,加深了对Android开发的理解。
1.4论文的结构
本论文共分为五章。
第一章:
绪论。
介绍了本项目的背景以及本人所需要做的工作和论文的结构。
第二章:
聊天室的技术背景。
简单介绍了该聊天室需要用到的一些技术。
第三章:
系统分析。
分析了该系统的可行性以及该系统的总体构架。
第四章:
聊天室的设计与实现。
详细分析完成一个聊天室所需要完成的工作,包括各个模块功能说明、详细设计与实现,并给出了模块的流程图。
第五章:
系统的测试。
任何一个系统的开发,必定伴随着系统的测试。
对系统进行测试,帮我找出来系统所存在的问题,得以完善。
2聊天室的技术背景
2.1TCP/IP简介
TCP/IP是TransmissionControlProtocol/InternetProtocol的简写,即传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议。
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。
一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
2.2Socket的基本机制
所谓的Socket通常也称作为“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket有一个IP地址和一个端口号确定,在Java环境中实现基于TCP/IP协议的网络编程都需要采用Socket机制。
一个Socket通信无论功能多么齐全、程序多么复杂,其基本结构均应包括以下步骤:
创建Socket对象,建立连接;
打开连接到Socket的输入、输出流;
对Socket进行读写操作;
关闭Socket。
在一个Socket通信中要使用两个关键方法:
getInputStream和getOutputStream。
前者得到一个输入流,客户端Socket对象上得到的输入流是从服务器端发回来的数据流;
后者得到的是一个输出流,客户端Socket对象上返回的输出流是将要发送到服务器端的数据流。
Socket通常采用C/S结构,使用Socket进行C/S程序设计的一般链接过程如图2.1所示:
图2.1Socket编程链接一般过程
2.3Serializable简介
Java的“对象序列号”能将一个实现了Serilizable接口的对象转换成一组byte,日后要用到这个对象的时候,能把这些byte数据恢复出来,并据此重构那个对象。
这一过程亦可通过网络进行,这意味着序列化机制能自动补偿操作系统间的差异。
换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。
不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。
Serialization主要用来支持2种主要的特性:
1.RMI(Remotemethodinvocation)。
RMI允许像在本机上一样操作远程机器上的对象。
当发送消息给远程对象和调用远程方法时,就需要用到serialization机制来发送参数和接收返回值。
2.保存信息。
在某个时候把状态信息保存起来,以便以后某个时候能恢复这些状态信息。
另外:
保存的时候不仅能保存对象的副本,而且还会把对象里面所应用的对象也保存起来,以此类推。
就像在编译某个类一样,会涉及到所用到的所有类。
但是所引用的对象也必须是可序列化的,不然会抛NotSerializableException异常。
本系统的设计需要用到序列化接口来实现两个自定义类的序列化。
第一个为User类包含五个变量,分别为account(账号)、password(密码)、nickname(昵称)、operation(操作标记:
登陆、注册)、avatar(头像ID)。
另外在User类中还定义了一个serialVersionUID。
因为Java的序列化机制是在运行时通过判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM会把传过来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
另外一个需要实现Serializable接口的是WQMessage。
它包含着七个变量,分别为type(包含各种标志,如SUCCESS、FAIL)、sender(发送者)、senderNick(发送者昵称)、senderAvatar(发送者头像)、content(信息内容)、receiver(接收者)、sendTime(发送时间)。
2.4BroadcastReceiver简介
所设计的聊天室的聊天功能并没有一直与服务端进行连接,而是在启动一个线程与服务端保持连接,接收来自服务端的信息,再以广播的形式传递到ChatActivity中的。
BroadcastReceiver用于接收程序(包括用户开发的程序和系统内建的程序)所发出的BroadcastIntent。
启动BroadcastReceiver只需要两步:
1、创建需要启动的BroadcastReceiver的Intent。
Intentintent=newIntent("
org.yhn.yq.mes"
);
2、调用ContextdesendBroadcast()方法来启动指定的BroadcastReceiver。
String[]message=newString[]{
m.getSender()+"
"
m.getSenderNick(),
m.getSenderAvatar()+"
m.getContent(),
m.getSendTime(),
m.getType()};
intent.putExtra("
message"
message);
context.sendBroadcast(intent);
线程已经发出广播,我们只需要重写BroadcastReceiver的onReceiver()就可以,因为BroadcastReceiver本质上属于一个监听器。
一旦实现了BroadcastReceiver,接下来就应该指定该BroadcastReceiver能匹配的Intent,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiverreceiver,IntentFilterfilter)方法来指定。
代码如下
IntentFiltermyIntentFilter=newIntentFilter();
myIntentFilter.addAction("
br=newMyBroadcastReceiver();
registerReceiver(br,myIntentFilter);
每次系统Broadcast事件发生后,系统就会创建对应的onReceiver()方法,onReceiver()方法执行完之后,BroadcastReceiver的实例就会被销毁。
3系统分析
3.1聊天室可行性的分析
这次设计的聊天室采用的是当前流行的Java语言,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,JavaEE,JavaME)的总称。
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用与个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同事拥有全球最大的开发者专业社群。
编辑器利用的是Eclipse,这种编辑器具有很好的提示功能,支持插件,使用方便。
服务器使用的数据库为Mysql,这种数据库易于安装,所占空间小,启动快,使用NavicatforMySQL软件对其进行管理非常方便。
因此,开发一个聊天室是完成不成问题的。
3.2系统的总体架构
整个聊天系统分为两部分:
客户端和服务端。
客户端运行于Android模拟器或者Android手机上,而服务端位于电脑上。
客户端创建的Socket与服务器端的ServerSocket进行交互来实现网络数据交互。
Socket与ServerSocket的交互过程如下:
(1)服务端将创建一个ServerSocket类,同时在运行该语句的计算机的指定端口创建一个监听服务,如:
ServerSocketserversocket=newServerSocket(5555);
这里指定端口5555,为了随时监可能听来自客户端的请求,执行如下语句:
Sockets=serversocket.accept();
该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使服务端的程序处于等待状态,程序将一直阻塞到捕捉到一个来自客户端的请求。
(2)客户端将创建一个Socket对象,使之能与服务端进行数据的交互:
Socketsocket=newsocket("
ServerComputerIP"
5555);
Socket类的构造函数有两个参数,第一个参数ServerComputerIP为服务器所在电脑的IP地址,第二个为服务端所监听的端口号。
(3)建立了连接的客户端与服务器端的两个socket各开启一条线程,使两个socket保持连接。
数据交互采用getOutputStream()和getInputStream()。
客户端发出数据后,有服务端接收,再转发给所有在线的客户端,最后由各个客户端接收。
并且,getOutputStream()和getInputStream()的位置不能颠倒,不然程序无法实现。
客户端的Socket与服务器端的ServerSocket的通信如图2.2:
图3.1Socket与ServerSocket的通信图
4聊天室的设计与实现
4.1聊天室的总体概述
该聊天系统包括两个部分:
客户端与服务端。
客户端应用了Android手机,面向广大的用户群体,主要实现了用户的登陆,注册以及聊天功能等功能,在用户实现登陆的时候,会向所有客户端发送该用户已经上线的消息,便能实现即时聊天。
服务端位于电脑上,主要完成了用户信息的存储、客户端命令的接收与响应以及信息转发等功能。
此系统使用的是TCP/IP协议,其通讯模式如图4.1所示:
图4.1客户端/服务端Socket通讯模式图
4.2客户端的设计与实现
客户端主要分为3个模块:
登陆模块、注册模块和聊天模块。
模块的分布如图4.2所示:
图4.2聊天室客户端模块
4.2.1登陆模块
1、activity的启动
启动程序时,最先启动的activity是LoginActivity,即登陆模块,显示的是登陆界面。
哪个activity最先启动,是由AndroidManifest.xml清单文件所决定的,它是每个Android项目所必须的,是整个Android应用的全局描述文件。
执行以下语句,代表着LoginActivity是最先启动的:
<
activity
android:
name="
com.example.wqchat.LoginActivity"
label="
@string/app_name"
>
<
intent-filter>
actionandroid:
android.intent.action.MAIN"
/>
categoryandroid:
android.intent.category.LAUNCHER"
/>
/intent-filter>
/activity>
2、登陆界面
登陆模块主要负责处理用户的登陆操作,并在用户成功登陆后跳转至聊天界面。
启动LoginActivity时,调用login_activity.xml资源文件来显示UI界面,登陆的界面由两个TextView、两个EditText、两个Button和一个CheckBox组成,两个TextView显示的是账户跟密码,两个EditText用来输入账户密码,两个Button中,一个为注册按钮,一个登陆按钮,最后的CheckBox是用来选择是否显示密码的。
用户启动程序后,到了登陆界面,输入用户名和密码,点击登陆按钮。
先判断输入的账号密码是否为空,如果不为空,就将账号密码序列化封装到一个User类,使用以下代码:
Useruser=newUser();
user.setAccount(accout);
user.setPassword(passwaord);
user.setOperation("
login"
信息传递到服务端,进行反序列化,解析出来,判断为“login”标志,连接到数据库,判断账号密码是否正确,如果正确,返回一个“SUCCESS”标志,客户端接收到“SUCCESS”标志,显示登陆成功,并且跳转到聊天界面。
如果账号密码不正确,将返回一个“FAIL”标志,客户端接收到此标志,显示登陆失败。
陆界面设计如图4.3所示:
图4.3登陆界面
登陆流程如图4.4所示:
图4.4登陆流程图
3、密码的显示方式
在现实生活中,我们将使用到各式各样的密码,不管在任何场合,任何时间使用任何种密码,其共同的目的都是不想让人家知道自己的密码,所以在输入密码的时候,最好显示出来的不是明码,而是一些符号。
但是在没旁人的时候,突然忘记自己输入的密码是否是正确的,但又不想把密码删除再重新输入。
所以,在设计中,我加入了一个CheckBox,其功能是让用户选择你所输入的密码是显示明码还是符号。
其中,显示明码的语句如下:
etpassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
让密码显示为符号的语句如下:
etpassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
4、记住密码
不管是在聊天软件中还是别的软件中,将用户登陆时的账号和密码保存下来,等待下次打开的时候直接显示用户名和密码,也就是记住用户名和密码是非常普遍的,也是非常必须的。
因为这关系到用户的体验。
试想一下,你每次开启这软件的时候都需要重新输入账号跟密码,这是很烦人的。
想让用户觉得该软件是好软件,就需要从细节着手。
我们在Android的开发中,应用程序都必然涉及数据的输入、输出。
而对于记住账号和密码,程序只需保存很少的数据量,而且这些数据的格式都很简单:
都是普遍的字符串。
因此,我使用了SharedPreferences来进行保存数据。
SharedPreferences保存的数据主要是类似于配置信息格式的数据,它保存的数据主要是简单类型的key—value对。
这非常符合该聊天软件记住密码这个功能。
当我们输入了账号与密码之后,点击了登陆按钮,先判断记住密码的CheckBox是否选中,如果选中了,则将账号输入框与密码输入框获取到的账号密码保存到saveUserNamePwd文件夹中,该文件夹只有两个参数,一个是username,另一个是password。
关键代码如下:
if(remeber.isChecked()){
StringusernameContent=etaccount.getText().toString();
StringpasswordContent=etpassword.getText().toString();
//获取SharedPreferences时,需要设置两参数
//第一个是