您现在的位置: 启天网 >> 技术中心 >> .net >> 正文
今天是:
使LumaQQ.NET支持接收长消息            【字体:
使LumaQQ.NET支持接收长消息
作者:未知    文章来源:转载    点击数:    更新时间:2008-4-23
     之前的文章里说明了怎么让LumaQQ.NET发送长消息,这里我们看看怎么让LumaQQ.NET支持接收长消息。
  
   其实QQ的服务器在发送长消息时,是将其拆分成几个短的消息来发送的,这点在上一篇发送长消息时,大家已经能看出来了。那么怎么将几个短消息合并成一个长消息呢。
  
   这里主要是用到了NormalIM的TotalFragments和FragmentSequence两个属性,FragmentSequence表示这个是第几个分片,基于0的index,TotalFragments表示一共有几个分片。
  
   由于收到消息时,不一定是按照顺序接收到的(网络延迟等原因),因此我们定一个Dictionary来管理分片。
  
  private static Dictionary<int, Dictionary<int, byte[]>> NormalLongTextDict = new Dictionary<int, Dictionary<int, byte[]>>();
  
   然后在接收到消息的事件里,进行判断和组装
  void MessageManager_ReceiveNormalIM(object sender, LumaQQ.NET.Events.QQEventArgs<LumaQQ.NET.Packets.In.ReceiveIMPacket, OutPacket> e){ if (e.InPacket.NormalIM.TotalFragments > 1)//如果是长消息的分片 { Dictionary<int, byte[]> TextFragment; if (!NormalLongTextDict.ContainsKey(e.InPacket.NormalIM.MessageId))//如果字典里没有缓存这个消息id { TextFragment = new Dictionary<int, byte[]>(); TextFragment.Add(e.InPacket.NormalIM.FragmentSequence, e.InPacket.NormalIM.MessageBytes);//将分片加入以分片id为标示的分片缓存 NormalLongTextDict.Add(e.InPacket.NormalIM.MessageId, TextFragment);//将分片缓存加入以消息id为标示的消息缓存 } else { TextFragment = NormalLongTextDict[e.InPacket.NormalIM.MessageId];//取出分片缓存 TextFragment.Add(e.InPacket.NormalIM.FragmentSequence, e.InPacket.NormalIM.MessageBytes);加入新的分片 NormalLongTextDict[e.InPacket.NormalIM.MessageId] = TextFragment;放回消息缓存 } if (TextFragment.Count == e.InPacket.NormalIM.TotalFragments)//如果所有分片都已经接收完毕 { List<byte> LongTextBytes = new List<byte>(); string LongText = ""; for (int i = 0; i < TextFragment.Count; i++) { LongTextBytes.AddRange(TextFragment[i]);合并byte数组 } LongText = Encoding.GetEncoding(QQGlobal.QQ_CHARSET_DEFAULT).GetString(LongTextBytes.ToArray());转为文字字符串 NormalLongTextDict.Remove(e.InPacket.NormalIM.MessageId);//删除缓存 e.QQClient.MessageManager.SendIM(e.InPacket.NormalHeader.Sender, string.Format("我收到你的消息:{0}", LongText); } } else { WriteError("收到好友:{0}/{1} 发来的信息:{2}", e.InPacket.NormalHeader.Sender, Nick, AnalyCustomFace(e.InPacket.NormalIM.MessageBytes)); e.QQClient.MessageManager.SendIM(e.InPacket.NormalHeader.Sender, string.Format("我收到你的消息:{0}", e.InPacket.NormalIM.Message)); } }  
文章录入:junsan    责任编辑:junsan 
  • 上一篇文章:
  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    初尝Deep Zoom Composer
    可扩展的文件同步设计
    QuickGUI编辑器系列---从文件中读取并解析
    介绍WS Federaion 二:把百度和谷歌和谐起来
    代码着色--关于循环与分组
    My97日期控件 My97 DatePicker 4.0 Prerele…
    介绍 WS-Federation 一: 让Passport和传统…
    将特定格式的TXT数据文件写入EXCEL
    WPF里的DependencyProperty(4)
    编程游戏:划拳机器人比赛
     网友评论:(最新10条。只代表网友观点,与本站立场无关!)