移动QQ代码研究之网络操作
2006-04-21 22:43
435 查看
首先,移动QQ的数据传输命令是明文的,对于传递的内容则是采用了MD5加密算法。传输的格式类似CGI格式。比如改变状态的传输的内容是:"VER=1.0&CMD=Change_Stat&SEQ=" + iSeqNo++ + "&UIN=" + strUin + "&ST=" + s; 格式就是关键字+内容的形式,每个关键字的后面跟它所对应的内容。
在发送命令的时候首先将请求命令放在一个Vector对象里,然后调用Notify()来唤醒线程。线程在运行的时候首先判断请求Vector对象里是否有内容,如果没有则进入等待状态,如果有内容则调用http连接发送请求。这里注意的地方是,一旦用户登陆成功,那么网络操作层会一直运行,也就是说网络连接是一直在运行的。那么可能有人会有怀疑,如果用户不去发送网络数据,那么手机会不会自动将网络连接断掉。这种情况是存在的,移动QQ其实是开了两个连接线程,一个是Timer对象,使用TimeTask就是每阁一段时间去刷新用户好友的在线状态。
下面以伪代码来说明这些步骤,每个请求都写成了单一的函数,比如说,用户发送消息:
public void sendMsg(String s, String s1)
{
String s2 = null;
s2 = "VER=1.0&CMD=CLTMSG&SEQ=" + iSeqNo++ + "&UIN=" + strUin + "&UN=" + s + "&MG=" + s1;
sendRequest(s2, httpposterlistener);//这个函数的作用是唤醒线程
}
public synchronized void sendRequest(String s)
{
if(iSeqNo == 65535)
iSeqNo = 1;
requestQueue.addElement(s);
notify(); //唤醒 个人感觉还是采用对象锁来处理好点
}
唤醒线程后,会调用下面的函数
private boolean doSend(String s)
httpconnection = (HttpConnection)Connector.open(KQQMIDlet.url, 3, true);
httpconnection.setRequestMethod("POST");
byte abyte0[] = PkgTools.convertUnicode2UTF8Byte(s);
httpconnection.setRequestProperty("Content-Length", "" + abyte0.length);
dataoutputstream = httpconnection.openDataOutputStream();
dataoutputstream.write(abyte0);
dataoutputstream.flush();
这样就是整个网络操作过程,当然它还有个监听网络运行的接口,下次再讲吧^_^(转载请注明出处www.mobilercn.com移动频道,更多内容请访问论坛)
在发送命令的时候首先将请求命令放在一个Vector对象里,然后调用Notify()来唤醒线程。线程在运行的时候首先判断请求Vector对象里是否有内容,如果没有则进入等待状态,如果有内容则调用http连接发送请求。这里注意的地方是,一旦用户登陆成功,那么网络操作层会一直运行,也就是说网络连接是一直在运行的。那么可能有人会有怀疑,如果用户不去发送网络数据,那么手机会不会自动将网络连接断掉。这种情况是存在的,移动QQ其实是开了两个连接线程,一个是Timer对象,使用TimeTask就是每阁一段时间去刷新用户好友的在线状态。
下面以伪代码来说明这些步骤,每个请求都写成了单一的函数,比如说,用户发送消息:
public void sendMsg(String s, String s1)
{
String s2 = null;
s2 = "VER=1.0&CMD=CLTMSG&SEQ=" + iSeqNo++ + "&UIN=" + strUin + "&UN=" + s + "&MG=" + s1;
sendRequest(s2, httpposterlistener);//这个函数的作用是唤醒线程
}
public synchronized void sendRequest(String s)
{
if(iSeqNo == 65535)
iSeqNo = 1;
requestQueue.addElement(s);
notify(); //唤醒 个人感觉还是采用对象锁来处理好点
}
唤醒线程后,会调用下面的函数
private boolean doSend(String s)
httpconnection = (HttpConnection)Connector.open(KQQMIDlet.url, 3, true);
httpconnection.setRequestMethod("POST");
byte abyte0[] = PkgTools.convertUnicode2UTF8Byte(s);
httpconnection.setRequestProperty("Content-Length", "" + abyte0.length);
dataoutputstream = httpconnection.openDataOutputStream();
dataoutputstream.write(abyte0);
dataoutputstream.flush();
这样就是整个网络操作过程,当然它还有个监听网络运行的接口,下次再讲吧^_^(转载请注明出处www.mobilercn.com移动频道,更多内容请访问论坛)
相关文章推荐
- 研究方向确定:移动网络优化
- 全面解析DOM操作和jQuery实现选项移动操作代码分享
- kfs代码研究(写操作流程图)
- 移动开发多平台代码共享“.NET研究”
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- QT 操作 sqlite数据库(一)-----网络常规代码
- Android打开WIFI或者移动网络的代码实现
- VS2008:无法执行添加/移动操作,代码元素是只读的
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- 基于visual c++之windows核心编程代码分析(47)实现交换网络的QQ号嗅探
- js实现键盘操作实现div的移动或改变的原理及代码
- Android在代码中打开Wifi、移动网络和GPS
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- 成长手删代码40-listbox js操作上下左右移动.txt
- 扑克牌移动 下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程。
- IOS开发笔记-01按钮操作-13.上下左右移动 14.代码优化
- 网络中树型菜单实现方法及其效率研究 (代码3)
- IOS 开发进阶--多线程和网络--对于耗时操作的代码体验
- x264list操作代码研究