Android学习笔记:浅析自己的聊天系统的设计思想
在如今这个资料多如牛毛、牛人多于资料的社会,通过代码来做出某个东西已经渐渐不是很难的事情了,稍微有点难题只要一上各种专业论坛、各种技术群组,大家便会讨论的热火朝天,想不解决都难。技术我们可以学会,但是思想却很难,同样的一本书在不同的人看完之后都有不同的体会和感悟,那些牛人的思想都是在经历了无数浩浩的代码之后才体现出来(所以我们佩服那些公布自己心血的大牛,这种奉献精神是我们需要学习的),如何能快速的领悟牛人们的设计思想,对于像我们这样的菜鸟而言无疑是巨大的困难,正是有了大牛们的无私奉献,我们的学习注定会事半功倍,我们不需要魔鬼般代码的训练也可以领会高深的思想,使我们受益无穷。
本着学习的态度,且为了记录自己的感悟,在此分析一下开发过的一个聊天应用的设计思想,方便以后复习回顾。
通信协议UDP,关于这个在此便不多阐述。
通过下面这个简单的图,来分析一下是如何设计的:
由上图可以看出,整个系统分为7大模块,视图、消息处理器、消息解析器、UDP服务、解析控制器、处理控制器,消息体。
其中整个流程顺序:
1、首先我们在Activity中注册一个消息处理器,该处理器用来处理接收到的消息,然后将结果显示在Activity中;
2、发送消息的时候,我们要将自己的信息封装成一个消息包
3、该消息包要通过udp传输的话,还需要经过特定的解析器进行解析,得到一段传输协议,当然解析器中有编码肯定也有解码,且必须规则一样。
4、将上面得到的一段传输协议在此处理分析
5、调用解析控制器
6、解析控制器会通过协议中的一些标志,调用相应的解析器来进行解码得到响应的消息包。
7、调用处理控制器,同时将上面得到的响应消息包传过来
8、通过响应消息包中的一些标志,来判断调用相应的处理器来进行处理,得到信息然后显示。
注意:
1、消息msg有很多种,比如有向网段发送的询问谁在线的消息包、有响应谁在线的消息包、有聊天消息包、有个人信息查看请求消息包等等等等。
例如,谁在线消息包WhoOnlinePackage:
[java]
public class WhoOnlinePackage extends MsgPackage{
private String mac ;
private String nickName;
private int portrait;
@Override
public Integer getMsgCode() {
return MsgCode.WHOONLINE;
}
public WhoOnlinePackage(String nickName, String mac,int portrait) {
this.mac = mac;
this.nickName = nickName;
this.portrait = portrait;
}
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public int getPortrait() {
return portrait;
}
public void setPortrait(int portrait) {
this.portrait = portrait;
}
public WhoOnlinePackage() {}
}
2、消息包有多少种,就有多少种解析器,每个解析器针对不同的msg做不同的编码和解码工作。
例如:谁在线消息包解析器:
[java]
public class WhoOnlinePackageParser extends MsgPackageParser<WhoOnlinePackage>{
@Override
public WhoOnlinePackage decode(PackageInputStream in) throws IOException {
return new WhoOnlinePackage(in.readString(10, CHARSET),MsgPackageUtils.getLongMacToString(in.readLong()),in.readInt());
}
@Override
public void encode(WhoOnlinePackage obj, PackageOutputStream out) throws IOException {
out.writeString(obj.getNickName(), 10);
out.writeLong(MsgPackageUtils.getStringMacToLong(obj.getMac()));
out.writeInt(obj.getPortrait());
}
}
可以看到解析器中,编码和解码都是根据传输协议的规则来进行相应的处理。
3、同样有多少种解析器,就有多少种处理器。处理器根据解析器解析出来的消息包然后进一步进行处理,得到结果进行显示。
例如,在Activity中的处理器的实现:
[java]
@Override
public void onMsgReceived(MsgPackage msgPackage) {
switch (msgPackage.getMsgCode()) {
case MsgCode.WHOONLINE:
WhoOnlinePackage wpck = (WhoOnlinePackage)msgPackage; //得到别人询问谁在线的消息包
ImOnlinePackage ipck = new ImOnlinePackage(preferences.getString("nick", DicqConstant.LOCALNAME),preferences.getString("mac",DicqConstant.DEFAULTMAC),preferences.getInt("portrait",getLocalInfo().getPortrait())); //回应他我在线的消息包,同时把本地信息封装
ipck.addTargetIp(wpck.getFromIp());
sendMsgPackage(ipck, wpck.handlerTag);
int wteamid = -1;
Team wteam = service.getTeamByMac(wpck.getMac());
if(wteam==null){
try {
wteamid = service.find("weimingming").getTeamId();
} catch (Exception e) {
e.printStackTrace();
}
}else{
wteamid = wteam.getTeamId();
}
&
补充:移动开发 , Android ,