<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      atomQQ 筆記 之 聊天消息、狀態消息等各種消息的輪詢

      要做一個im軟件,消息收發的即時性就是靈魂了,我在atomQQ中,使用了service來進行對服務器的消息輪詢(-_-!! 除了service還能用啥呢。。)

      這里首先說明webqq3的消息輪詢機制

      通過抓包發現,webqq接受各種即時消息是通過這個post http://d.web2.qq.com/channel/poll2這個地址實現的

      POST http://d.web2.qq.com/channel/poll2

      這個提交的超時時間要長,一定要長,服務器是這樣給你推送消息的:

      * 客戶端首先post上面那個地址,并在一個長時間內等待服務器返回

      * 服務器檢查是否有沒有推送出去的消息,如果沒有,而且打到了服務器自己的超時時間,則會返回一個標準json:

        {"retcode":21,"result":"error"}

      * 服務器有消息推送的話,返回的result就不是字符串了。

      我在service中是通過兩個線程來獲取消息內容,首先同時開啟兩個線程,第二個線程被阻塞等待,第一個線程只要在httpUrlConnection中得到一個返回,立馬把第二個線程的阻塞狀態取消,即刻Post服務器的輪詢地址,這樣,不管消息有多密集,在即時性方面有很大的提高。

      具體代碼如下:

        1 **
      2 * 消息輪詢器,用以獲取各種即時消息,上到系統消息,下到聊天消息
      3 * @author 作者 E-mail:hangxin1940@gmail.com
      4 * @version 創建時間:2011-9-3 上午01:45:15
      5 */
      6 public class MessagePoll {
      7 private boolean beRun;
      8
      9 private String pars;
      10 private Thread pollThread;
      11 private Thread pollHandler;
      12 private BlockingQueue<String> threadQueue;
      13
      14 private Context service;
      15
      16 public MessagePoll(Context service) throws Exception {
      17 this.service=service;
      18 JSONObject r=new JSONObject();
      19 String clientid=CookieUtil.getCookieValue("clientid");
      20
      21 r.put("clientid", clientid);
      22 String psession=CookieUtil.getCookieValue("psessionid");
      23 r.put("psessionid",psession );
      24 r.put("key", 0);
      25 JSONArray ja=new JSONArray();
      26 r.put("ids", ja);
      27
      28
      29 pars="r="+URLEncoder.encode(r.toString(),"UTF-8")+"&clientid="+clientid+"&psessionid="+psession;
      30
      31 }
      32
      33 /** 這里用來進行一個持久的訪問連接*/
      34 private Runnable pollRuner=new Runnable() {
      35
      36 @Override
      37 public void run() {
      38 HttpPostConnction conn=new HttpPostConnction(URLs.MESSAGE_POLL, pars);
      39 String result;
      40 while(beRun){
      41 try {
      42 result=conn.connect(URLs.REFER_d_web2_qq_com_proxy);
      43 threadQueue.put(result);
      44 } catch (Exception e) {
      45 e.printStackTrace();
      46 }
      47 }
      48 }
      49 };
      50
      51 /**這里用來處理服務器發送來的數據*/
      52 private Runnable handlerRunner=new Runnable() {
      53
      54 @Override
      55 public void run() {
      56
      57
      58 while(beRun){
      59 try {
      60 String result=(String) threadQueue.take();
      61 JSONObject re=new JSONObject(result);
      62 int retcode=re.getInt("retcode");
      63 //如果是消息,組裝成非標準bean
      64 if(retcode==0){
      65
      66
      67
      68 JSONArray res=new JSONArray();
      69 try{
      70 res=re.getJSONArray("result");
      71 }catch (Exception e) {
      72 Log.e("Result",result);
      73 }
      74 for(int i=0;i<res.length();i++){
      75 JSONObject message=res.getJSONObject(i);
      76 String poll_type=message.getString("poll_type");
      77
      78
      79 //如果是群消息
      80 if("group_message".equals(poll_type)){
      81 GroupMessage gmessage=new GroupMessage();
      82
      83 JSONObject value=message.getJSONObject("value");
      84 gmessage.msg_id=value.getInt("msg_id");
      85 gmessage.from_uin=Long.toString(value.getLong("from_uin"));
      86 gmessage.to_uin=Long.toString(value.getLong("to_uin"));
      87 gmessage.msg_id2=value.getInt("msg_id2");
      88 gmessage.msg_type=value.getInt("msg_type");
      89 gmessage.reply_ip=Long.toString(value.getLong("reply_ip"));
      90 gmessage.group_code=Long.toString(value.getLong("group_code"));
      91 gmessage.send_uin=Long.toString(value.getLong("send_uin"));
      92 gmessage.seq=value.getInt("seq");
      93 gmessage.time=value.getLong("time")*1000;
      94 gmessage.info_seq=Long.toString(value.getLong("info_seq"));
      95
      96 JSONArray content=value.getJSONArray("content");
      97 MessageContent mcontent=getContent(content);
      98 gmessage.content=mcontent;
      99
      100 Intent intent=new Intent("org.atom.reciver");
      101 intent.putExtra("group_message", gmessage);
      102 sendMessage(intent);
      103 }
      104 //如果是好友信息
      105 else if("message".equals(poll_type)){
      106 FriendMessage fmessage=new FriendMessage();
      107
      108 JSONObject value=message.getJSONObject("value");
      109 fmessage.msg_id=value.getInt("msg_id");
      110 fmessage.from_uin=Long.toString(value.getLong("from_uin"));
      111 fmessage.msg_id2=value.getInt("msg_id2");
      112 fmessage.msg_type=value.getInt("msg_type");
      113 fmessage.reply_ip=Long.toString(value.getLong("reply_ip"));
      114 fmessage.time=value.getLong("time")*1000;
      115
      116 JSONArray content=value.getJSONArray("content");
      117 MessageContent mcontent=getContent(content);
      118 fmessage.content=mcontent;
      119
      120 Intent intent=new Intent("org.atom.reciver");
      121 intent.putExtra("friend_message", fmessage);
      122 sendMessage(intent);
      123
      124 }
      125 //如果是好友狀態信息
      126 else if("buddies_status_change".equals(poll_type)){
      127
      128 FriendStatusMessage fsmessage=new FriendStatusMessage();
      129
      130 JSONObject value=message.getJSONObject("value");
      131 fsmessage.client_type=value.getInt("client_type");
      132 fsmessage.uin=Long.toString(value.getLong("uin"));
      133 fsmessage.status=value.getString("status");
      134
      135 Intent intent=new Intent("org.atom.reciver");
      136 intent.putExtra("friend_status_message", fsmessage);
      137 sendMessage(intent);
      138 }
      139
      140
      141 }
      142
      143
      144 }
      145
      146
      147 } catch (Exception e) {
      148 e.printStackTrace();
      149 }
      150 }
      151 }
      152
      153 /**獲取消息內容
      154 * @throws JSONException */
      155 private MessageContent getContent(JSONArray content) throws JSONException{
      156 MessageContent mcontent=new MessageContent();
      157
      158
      159 //獲取字體信息
      160 JSONArray font=content.getJSONArray(0);
      161 mcontent.font_color=font.getJSONObject(1).getString("color");
      162 mcontent.font_size=font.getJSONObject(1).getInt("size");
      163
      164 for(int i=1;i<content.length();i++){
      165 ChatMessage cmessage=new ChatMessage();
      166
      167
      168 String v=content.getString(i);
      169
      170 //如果當前信息是個圖片
      171 if(v.startsWith("[")){
      172
      173 JSONArray m=new JSONArray(v);
      174 String type=m.getString(0);
      175 Log.e("圖片json", m.toString());
      176
      177 //如果是默認表情
      178 if("face".equals(type)){
      179 cmessage.type=ChatMessage.FACE;
      180 cmessage.face=String.format("%03d", m.getInt(1));
      181 }
      182 //如果是個自定義表情或圖片
      183 else if("cface".equals(type)){
      184 cmessage.type=ChatMessage.CFACE;
      185 cmessage.message=m.getString(1);
      186 }
      187 //如果是個離線圖片
      188 else if("offpic".equals(type)){
      189 cmessage.type=ChatMessage.CFACE;
      190 JSONObject path=m.getJSONObject(1);
      191 cmessage.message=path.getString("file_path");
      192 cmessage.success=path.getInt("success");
      193 }
      194
      195 }
      196 //如果是文字信息
      197 else{
      198 cmessage.type=ChatMessage.TEXT;
      199 cmessage.message=v;
      200 }
      201
      202 mcontent.addChatMessage(cmessage);
      203
      204 }
      205
      206
      207 return mcontent;
      208 }
      209 };
      210
      211 /**開始輪詢服務器*/
      212 public void startPoll(){
      213 beRun=true;
      214
      215 threadQueue= new ArrayBlockingQueue<String>(1);
      216
      217 pollThread=new Thread(pollRuner);
      218 pollHandler=new Thread(handlerRunner);
      219
      220 pollThread.start();
      221 pollHandler.start();
      222 }
      223
      224 /**自己消化消息或者發送消息*/
      225 private void sendMessage(Intent message){
      226 //如果主程序是打開狀態,發送出去
      227 if(true){
      228 service.sendBroadcast(message);
      229 }
      230 }
      231
      232
      233
      234
      235
      236 }

        

      最后,在每次獲得消息后,自行組裝成bean,通過廣播等什么方法發送出去就行了。

      posted on 2011-09-13 17:59  黑暗伯爵  閱讀(1344)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 欧美巨大巨粗黑人性aaaaaa| 黄页网站在线观看免费视频| 国产精品毛片av999999| √天堂中文www官网在线| 中文在线а√天堂| 精品国产美女av久久久久| 日本不卡一区二区三区在线| 国内精品极品久久免费看| 无码国内精品久久人妻蜜桃| 视频一区视频二区制服丝袜 | 国产偷国产偷亚洲清高| 国产成人8x视频网站入口| 高清自拍亚洲精品二区| 东京热一区二区三区在线| 看亚洲黄色不在线网占| 人妻少妇精品无码专区二区| 一色桃子中出欲求不满人妻| 一区二区丝袜美腿视频| 人人澡超碰碰97碰碰碰| 国产精品视频第一第二区| 久久精品熟女亚洲av艳妇| 97色成人综合网站| 日本熟妇XXXX潮喷视频| 久久国产精品夜色| 国产AV福利第一精品| 亚洲精品国产老熟女久久| 亚洲欧美日韩综合久久| 美女人妻激情乱人伦| 色伊人久久综合中文字幕| A级毛片100部免费看| 久久综合给合久久狠狠狠88| 午夜福利片1000无码免费| 天美传媒一区二区| 成人午夜福利视频一区二区| 亚洲日本VA中文字幕在线| 扬中市| 老色批国产在线观看精品| 亚洲一卡2卡3卡4卡精品| 龙井市| 国产欧美日韩高清在线不卡 | 最新日韩精品视频在线|