YangtzeUniversityCollegeofArtsandScience学生课程设计报告系部:机电与信息工程系专业:计算机科学与技术班级:计科5131姓名:来超学号:201241136课程名称:移动平台数据库综合开发指导教师:王腾实习时间:2016年6月20日至2016年6月27日1android即时通讯软件摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。基于Java网络编程的强大功能,本次课程设计使用Java编写一个运行在android2.2版本以上的即时通讯软件。一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成。Java提供的多线程功能用多线程可完成一点对多点的聊天,数据库管理系统用SQLlite来访问数据库的。本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端与客户端以及客户端与服务器端之间传送消息。使用JAVA语言编写,开发工具采用AS。在智能手机中,Android平台约占75%市场份额。安卓系统的广泛应用,使得Android手机应用程序的数量快速增长,即时通讯APP的应用范围也更加广泛。关键字:多线程;客户机/服务器;JAVA;AS;Android手机应用21.开发背景Android的英文翻译是指“机器人”,而Android这个词语作为操作系统的名称出现,是谷歌在2007年发布了应用在手机平台上的操作系统,自此Android作为手机操作系统出现在人们的视野中。同时由于Android的操作系统的开源性和可开发性使得以Android操作系统的应用软件日益增多。Android操作系统被越来越多的人接受和使用。目前的Android聊天软件基本分为2种架构形式:(1)C/S架构:采取客户端/服务器对等传输的形式,用户方主要使用客户端软件,使用前用户通过网上下载客户端软件,再安装到手机上进行使用,市场上流行的C/S架构的聊天软件有以下几种:QQ、微信、微博、YY、MSN等;(2)B/S架构:浏览器/服务端对等传输的形式,这种形式下的即时通信工具,一般都是依赖于互联网,作为用户无需下载客户端,用户一般在浏览往网上网页时浏览器会提供一个类似于客户端的界面使用户可以发送消息,此架构一般应用在数据流比较大的电商网站,如WebQQ等。32.软件需求分析2.1软件开发的工具和环境1.开发环境:AS2.开发语言:JAVA3.模拟机平台:AVD4.手机运行平台:Android2.1以及上版本开发软件5.所需插件:JDK2.2安装JDK和SDK先从网站上找到JDK1.6(JREaloneisnotsufficient)版本并下载,下载完毕后将它安装在PC机上并在PC机上设置好有关的环境变量,将JAVA_HOME,path等几个设置为适用于Java开发的环境变量,最后将其导入你的JDK文件路径SDK安装:直接从相关网站下载好SDK压缩包,然后打开Eclipse软件,在其中找到对应路径将其导入就可以。43、原理与技术要点分析3.1登录功能概要点击button按钮服务器验证登录账号跳转进入好友列表界面登录流程图:失判断账号密码败是否正确1.1登录功能流程图3.2聊天功能概要用户点击联系人列表中的一个好友时,进入聊天界面在输入框输入信息,点击发送按钮,发送信息好友回复消息是在该聊天页面显示当有好友发消息过来时,系统会通过Toast提示用户聊天模块总体流程图:进入输入账号及密码服务器验证登录成功51.2用户聊天模块总体流程图3.3技术要点分析3.3.1概念结构设计3.3.2逻辑结构设计1)用户信息(用户账号,用户密码,昵称,头像)publicclassQQMessageextendsProtocal{publicStringtype=QQMessageType.MSG_TYPE_CHAT_P2P;//数据类型publiclongfrom=0;//发送者account6publicStringfromNick=;//QQ名publicintfromAvatar=1;//头像publiclongto=0;//接收者accountpublicStringcontent=;//消息内容(hi)publicStringsendTime=MyTime.getTime();//发送时间2)}会话信息(好友账号,好友头像,发送/接收消息时间,消息内容)publicclassQQMessageType{publicstaticfinalStringMSG_TYPE_REGISTER=register;//注册publicstaticfinalStringMSG_TYPE_LOGIN=login;//登录publicstaticfinalStringMSG_TYPE_LOGINOUT=loginout;//登出publicstaticfinalStringMSG_TYPE_CHAT_P2P=chatp2p;//聊天publicstaticfinalStringMSG_TYPE_CHAT_ROOM=chatroom;//群聊publicstaticfinalStringMSG_TYPE_OFFLINE=offline;//下线publicstaticfinalStringMSG_TYPE_SUCCESS=success;//成功publicstaticfinalStringMSG_TYPE_BUDDYLIST=buddylist;//好友列表publicstaticfinalStringMSG_TYPE_FAILURE=failure;//失败}74.详细设计4.1用户聊天模块4.1.1ChatActivity类publicclassChatActivityextendsActivity{ListViewlistView;TextViewtitle,send_nick,recv_nick;EditTextinput;Stringsix_space=;Stringtwo_space=;privateStringtoNick;privateLongaccount;ImAppapp;privateChatMessageAdapteradapter;ListQQMessagelist=newArrayList();//内容观察者:观察uri中是否出现数据库被修改的信号privateContentObserverobserver=newContentObserver(newHandler()){//观察到发生变化后,所做的动作//android2.2@OverridepublicvoidonChange(booleanselfChange){super.onChange(selfChange);requery();}//android4.0以上@OverridepublicvoidonChange(booleanselfChange,Uriuri){super.onChange(selfChange,uri);requery();}};privatevoidrequery(){//System.out.println(数据发生变化,取出数据刷新聊天界面);list.clear();querySetofChatWithOne(account+,list);if(adapter!=null){adapter.notifyDataSetChanged();}if(list.size()0){listView.setSelection(list.size()-1);}}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_chat);listView=(ListView)findViewById(R.id.listview_chat);title=(TextView)findViewById(R.id.tv_title);input=(EditText)findViewById(R.id.edt_input);send_nick=(TextView)findViewById(R.id.tv_send_nick);recv_nick=(TextView)findViewById(R.id.tv_recv_nick);8//注册内容观察者Uriuri=Uri.parse(content://+QQContactDBDao.class.getSimpleName());//getContentResolver().registerContentObserver(地址:信号,子路径是否有效,指定一个观察者);this.getContentResolver().registerContentObserver(uri,true,observer);app=(ImApp)getApplication();Intentintent=this.getIntent();Bundlebundle=intent.getExtras();account=bundle.getLong(account);toNick=bundle.getString(nick);title.setText(与[+toNick+]聊天中);querySetofChatWithOne(account+,list);adapter=newChatMessageAdapter(this,list);listView.setAdapter(adapter);if(list.size()-10){listView.setSelection(list.size()-1);}}//接收消息//1.messageType==p2p2.app.account==msg.to3.msg,account-toastpublicvoidclickSend(Viewv){StringmessageBody=input.getText().toString().trim();if(.equals(messageBody)){Toast.makeText(getBaseContext(),发送消息不为空,Toast.LENGTH_SHORT).show();return;}input.setText();finalQQMessagemsg=newQQMessage();msg.type=QQMessageType.MSG_TYPE_CHAT_P2P;msg.content=messageBody;msg.from=app.getAccount();msg.to=account;msg.fromNick=人族;//发送干两件事情//1:把消息显示到聊天记录区list.add(msg);//刷新listif(adapter!=null){adapter.notifyDataSetChanged();}//从最后一条开始显示if(list.size()0){listView.setSelection(list.size()-1);}//2:发送给聊天对象ThreadUtils.runInThread(newRunnable(){@Overridepublicvoidrun(){try{app.getCoreService().sendMessage(msg);}catch(Exceptione){e.printStackTrace();}}});}//把与当前好友聊天记录查询出来,//并显示到与当前好友的聊天界面privatevoidquerySetofChatWithOne(Stringsession_id,ListQQMessage