zoukankan      html  css  js  c++  java
  • 使LumaQQ.NET支持接收长消息

            之前的文章里说明了怎么让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));
     
        }
     
     
    }
  • 相关阅读:
    夯实Java基础系列5:Java文件和Java包结构
    夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
    夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
    夯实Java基础系列1:Java面向对象三大特性(基础篇)
    走进JavaWeb技术世界16:极简配置的SpringBoot
    深入JavaWeb技术世界15:深入浅出Mybatis基本原理
    走进JavaWeb技术世界14:Mybatis入门
    走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
    [转]ssm整合1(环境搭建)
    [转]基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题
  • 原文地址:https://www.cnblogs.com/lersh/p/1165919.html
Copyright © 2011-2022 走看看