移动QQ代码研究之网络操作

来源:互联网 发布:网络辅导 编辑:程序博客网 时间:2024/04/30 10:50
首先,移动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移动频道,更多内容请访问论坛)

原创粉丝点击