1、Yangtze University College of Arts and Science学生课程设计报告系 部: 机电与信息工程系 专 业: 计算机科学与技术 班 级: 计科 5131 姓 名: 来超 学 号: 201241136 课程名称: 移动平台数据库综合开发 指导教师: 王 腾 实习时间:2016 年 6 月 20 日至 2016 年 6 月 27 日0android 即时通讯软件摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的 ICQ、国内腾讯公司开发的 OICQ。基于 Java 网络编程的强大功能,本次课程设计使
2、用 Java 编写一个运行在 android2.2 版本以上的即时通讯软件。一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成。Java 提供的多线程功能用多线程可完成一点对多点的聊天,数据库管理系统用 SQLlite 来访问数据库的。本系统建立在 JAVA 平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用 C/S 结构,客户端与客户端以及客户端与服务器端之间传送消息。使用 JAVA 语言编写,开发工具采用 AS。在智能手机中,Android 平台约占 75市场份额。安卓系统的广泛应用,使得 Android 手机应用程序的数量快速增长,即
3、时通讯 APP 的应用范围也更加广泛。关键字:多线程;客户机/服务器 ;JAVA;AS ;Android 手机应用11.开发背景Android 的英文翻译是指“机器人 ”,而 Android 这个词语作为操作系统的名称出现,是谷歌在 2007 年发布了应用在手机平台上的操作系统,自此 Android 作为手机操作系统出现在人们的视野中。同时由于 Android 的操作系统的开源性和可开发性使得以 Android 操作系统的应用软件日益增多。Android 操作系统被越来越多的人接受和使用。目前的 Android 聊天软件基本分为 2 种架构形式:(1)C/S 架构:采取客户端/ 服务器对等传输
4、的形式,用户方主要使用客户端软件,使用前用户通过网上下载客户端软件,再安装到手机上进行使用,市场上流行的 C/S 架构的聊天软件有以下几种:QQ、微信、微博、YY、MSN 等;(2)B/S 架构:浏览器/服务端对等传输的形式,这种形式下的即时通信工具,一般都是依赖于互联网,作为用户无需下载客户端,用户一般在浏览往网上网页时浏览器会提供一个类似于客户端的界面使用户可以发送消息,此架构一般应用在数据流比较大的电商网站,如 WebQQ 等。22.软件需求分析2.1 软件开发的工具和环境1.开发环境:AS2.开发语言:JAVA3.模拟机平台:AVD4.手机运行平台:Android2.1 以及上版本开发
5、软件5.所需插件:JDK2.2 安装 JDK 和 SDK先从网站上找到 JDK1.6(JREaloneisnotsufficient)版本并下载,下载完毕后将它安装在 PC 机上并在 PC 机上设置好有关的环境变量,将JAVA_HOME,path 等几个设置为适用于 Java 开发的环境变量,最后将其导入你的 JDK 文件路径SDK 安装:直接从相关网站下载好 SDK 压缩包,然后打开 Eclipse 软件,在其中找到对应路径将其导入就可以。33、原理与技术要点分析3.1 登录功能概要 点击 button 按钮 服务器验证登录账号 跳转进入好友列表界面登录流程图:失 判断账号密码 败 是否正确
6、1.1 登录功能流程图3.2 聊天功能概要 用户点击联系人列表中的一个好友时,进入聊天界面 在输入框输入信息,点击发送按钮,发送信息 好友回复消息是在该聊天页面显示 当有好友发消息过来时,系统会通过 Toast 提示 用户聊天模块总体流程图:进入输入账号及密码服务器验证登录成功41.2 用户聊天模块总体流程图3.3 技术要点分析3.3.1 概念结构设计 3.3.2 逻辑结构设计1) 用户信息(用户账号,用户密码,昵称,头像) public class QQMessage extends Protocalpublic String type = QQMessageType.MSG_TYPE_CH
7、AT_P2P; / 数据类型public long from = 0; / 发送者 account5public String fromNick = “;/ QQ 名public int fromAvatar = 1; / 头像public long to = 0; / 接收者 accountpublic String content = “; / 消息内容(hi)public String sendTime = MyTime.getTime(); / 发送时间2) 会话信息(好友账号,好友头像,发送/接收消息时间,消息内容)public class QQMessageType public
8、static final String MSG_TYPE_REGISTER = “register“; / 注册public static final String MSG_TYPE_LOGIN = “login“;/ 登录public static final String MSG_TYPE_LOGINOUT = “loginout“;/ 登出public static final String MSG_TYPE_CHAT_P2P = “chatp2p“;/ 聊天public static final String MSG_TYPE_CHAT_ROOM = “chatroom“;/ 群聊pu
9、blic static final String MSG_TYPE_OFFLINE = “offline“;/ 下线public static final String MSG_TYPE_SUCCESS = “success“;/ 成功public static final String MSG_TYPE_BUDDYLIST = “buddylist“;/ 好友列表public static final String MSG_TYPE_FAILURE = “failure“;/ 失败64详细设计4.1 用户聊天模块4.1.1 ChatActivity 类public class ChatAct
10、ivity extends Activity ListView listView;TextView title,send_nick,recv_nick;EditText input;String six_space=“ “;String two_space=“ “;private String toNick;private Long account;ImApp app;private ChatMessageAdapter adapter;List list =new ArrayList0)listView.setSelection(list.size()-1);Overrideprotecte
11、d void onCreate(Bundle savedInstanceState) 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.i
12、d.tv_send_nick);recv_nick=(TextView)findViewById(R.id.tv_recv_nick);7/注册内容观察者Uri uri=Uri.parse(“content:/“+ QQContactDBDao.class.getSimpleName();/ getContentResolver().registerContentObserver(地址:信号,子路径是否有效,指定一个观察者);this.getContentResolver().registerContentObserver(uri,true,observer);app= (ImApp) get
13、Application();Intent intent = this.getIntent();Bundle bundle = intent.getExtras();account=bundle.getLong(“account“);toNick=bundle.getString(“nick“);title.setText(“与 “ +toNick +“聊天中“);querySetofChatWithOne(account+“,list);adapter=new ChatMessageAdapter(this,list);listView.setAdapter(adapter);if(list.
14、size()-10)listView.setSelection(list.size()-1);/接收消息/1.messageType=p2p 2.app.account=msg.to 3.msg,account-toastpublic void clickSend(View v)String messageBody=input.getText().toString().trim();if(“.equals(messageBody)Toast.makeText(getBaseContext(),“发送消息不为空“,Toast.LENGTH_SHORT).show();return;input.s
15、etText(“);final QQMessage msg=new QQMessage();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.se
16、tSelection(list.size()-1);/2:发送给聊天对象ThreadUtils.runInThread(new Runnable() Overridepublic void run() try app.getCoreService().sendMessage(msg); catch (Exception e) e.printStackTrace(););/ 把与当前好友聊天记录查询出来,/ 并显示到与当前好友的聊天界面private void querySetofChatWithOne(String session_id,ListmsgList)List dbmsgList=a
17、pp.getQqContactDBDao().queryRaw(“where SESSION_ID = ? order by SENDTIME 8ASC“,session_id);for(com.example.meiyu.qq_im.dao.QQContactDB item:dbmsgList)QQMessage msg = new QQMessage();msg.type = QQMessageType.MSG_TYPE_CHAT_P2P;msg.content = item.getContent();msg.from = item.getFrom();msg.to = item.getT
18、o();msg.fromNick = item.getFromNick();msgList.add(msg);Overrideprotected void onDestroy() super.onDestroy();getContentResolver().unregisterContentObserver(observer);4.1.2 SplashActivity 类public class SplashActivity extends Activity Overrideprotected void onCreate(Bundle savedInstanceState) super.onC
19、reate(savedInstanceState);setContentView(R.layout.activity_splash);ThreadUtils.runInThread(new Runnable() Overridepublic void run() try Thread.sleep(3000); /至少 3 秒,下限startActivity(new Intent(getBaseContext(),LoginActivity.class);finish(); catch (InterruptedException e) e.printStackTrace(););4.1.3 ac
20、tivity_login.xml4.1.4 activity_chat.xml4.2 客户端模块4.2.1 ContactActivity 类public class ContactActivity extends Activity ListView listView;ContactAdapter adapter;ImApp app;/好友列表List list =new ArrayList();/每一个 activity 必备的监听器IOnMessageReceiveListener listener=new IOnMessageReceiveListener() Overridepubli
21、c void onReceive(final QQMessage msg) ThreadUtils.runUnThread(new Runnable() Overridepublic void run() if(QQMessageType.MSG_TYPE_BUDDYLIST.equals(msg.type)String json=msg.content;Gson gson=new Gson();/反序列化QQContactList tempList=gson.fromJson(json,QQContactList.class);/刷新好友列表/首先设置列表值list.clear();list
22、.addAll(tempList.buddyList);/其次再刷新列表if(adapter!=null)11adapter.notifyDataSetChanged(););Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_contact);listView= (ListView) findViewById(R.id.listview_contact);app= (ImApp) getApp
23、lication();app.getCommunicaCore().addOnMessageReceiveListener(listener);/处理好友列表/先取出(app)String json=app.getBuddyListJson();System.out.println(json);/再处理(从 json 反序列化成对象)Gson gson=new Gson();QQContactList tempList=gson.fromJson(json,QQContactList.class);/把上面完成的对象加入到 list 里面去list.addAll(tempList.buddyL
24、ist);/绑定适配器adapter =new ContactAdapter(this,list);listView.setAdapter(adapter);/ 添加 item 的 click 监听器listView.setOnItemClickListener(new ListView.OnItemClickListener()Overridepublic void onItemClick(AdapterView parent, View view, int position, long id) / 获取数据QQContact contact = list.get(position);Int
25、ent intent = new Intent(getBaseContext(),ChatActivity.class);intent.putExtra(“account“,contact.account);intent.putExtra(“nick“,contact.nick);startActivity(intent););protected void onDestroy()super.onDestroy();app.getCommunicaCore().removeOnMessageReceiveListener(listener);4.2.2 LoginActivity 类public
26、 class LoginActivity extends Activity EditText account,psw;String username,password;QQCommunicationCore communicaCore;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);account= (EditText) findViewById(R.id.account);p
27、sw= (EditText) findViewById(R.id.psw);/网络链接ThreadUtils.runInThread(new Runnable() Overridepublic void run() try communicaCore=new QQCommunicationCore(“192.168.1.126“,20001);12communicaCore.addOnMessageReceiveListener(listener);communicaCore.connection(); catch (Exception e) e.printStackTrace(););/被回
28、调 本 activity 处理消息的核心IOnMessageReceiveListener listener=new IOnMessageReceiveListener() Overridepublic void onReceive(final QQMessage msg) ThreadUtils.runUnThread(new Runnable() Overridepublic void run() System.out.println(msg.toXML();if(QQMessageType.MSG_TYPE_BUDDYLIST.equals(msg.type)ImApp app= (Im
29、App) getApplication();/保存账号app.setAccount(Long.parseLong( account.getText().toString().trim();/保存连接(被保存过的连接叫长连接)app.setCommunicaCore(communicaCore);/保存好友列表 (好友列表在 content)app.setBuddyListJson(msg.content);Toast.makeText(getBaseContext(),“登录成功 “, Toast.LENGTH_LONG).show();/启动联系人界面startActivity(new In
30、tent(getBaseContext(),ContactActivity.class);/启动核心服务(启动式)startService(new Intent(getBaseContext(),CoreService.class);finish();else Toast.makeText(getBaseContext(),“登陆失败 “,Toast.LENGTH_LONG).show(););/只发送消息,不处理消息public void login(View v)username=account.getText().toString().trim();password=psw.getTex
31、t().toString();ThreadUtils.runInThread(new Runnable() Overridepublic void run() try QQMessage msg=new QQMessage();msg.type= QQMessageType.MSG_TYPE_LOGIN;msg.content=username+“#“+password;communicaCore.sendMessage(msg); catch (Exception e) e.printStackTrace(););Overrideprotected void onDestroy() supe
32、r.onDestroy();communicaCore.removeOnMessageReceiveListener(listener);134.2.3 activity_contact.xml4.2.4 item_contact.xml4.2.5 activity_splash.xml155、测试分析5.1 客户端具体功能实现 登录功能:建立与服务器的连接并登录,能显示登录成功信息。 界面显示:将好友显示在联系人列表中,并可以通过点击进入会话界面,进行与好友的聊天 聊天功能:当好友发送消息时会显示在会话界面。用户也同时可以在输入框中输入相应信息点击发送与好友聊天。 信息提示:Toast 提示
33、到来信息的好友账号。 用户在客户端点击应用程序图标后启动应用如下图:图 5-1 客户端启动界面16进入联系人界面后,点击好友账号,进入聊天功能。当好友发送消息时,会显示在会话界面。用户也同时可以在输入框中输入相应信息点击发送与好友聊天。聊天界面如下图:图 5-2 与好友聊天界面17心得体会本课程设计紧紧围绕了基于 Android 平台的移动聊天程序进行研究说明,针对基于Android 平台的应用程序开发已经及时通讯进行了深入的探讨。移动聊天程序是当今社会实现人机交互的重要技术支撑,通过分析相关移动聊天程序的各种功能需求,并用面向对象语言 Java 语言实现并封装好这些功能。然后又通过需求分析设
34、计了移动聊天程序所需的各个功能模块,并在需求分析的基础上最终通过编程封装实现了此聊天程序。此聊天程序流程主要分为:登录界面、好友界面、回话界面模块。Android 技术比较新颖,入门感觉稍微有些难,不过本系统能够让用户实现一对一的聊天、实现文字的收发,网络技术支持能功能,但是由于本人的经验不足和时间有限,以及对一些相关的技术、思想、理论掌握的还不够透彻,因此本系统中还存在许多不足、许多待完善的地方:例如界面不够美观等等。这些不足之处,会在今后的学习中不断的完善和维护,希望能够达到更好的效果。经过课程这个设计的磨练,对移动通讯行业有了更深的了解,也有了更多的知识来充实自己的大脑。18指导老师意见:成绩: 教师签名: 年 月 日